# -*- coding: utf-8 -*-

from django.db.models import Q
from restaurante.models import *
from configuracao.models import *
from registro.models import Evento
from estoque.models import Categoria, Setor
from cliente.models import Telefone, Endereco
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect, HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth.decorators import login_required, permission_required
from django.template import RequestContext
from django.contrib.auth import logout

import impressao.views

from datetime import datetime, date, timedelta

@login_required
@csrf_exempt
@permission_required('restaurante.abrir_caixa')
def abrir_caixa(request):
    if request.POST.has_key('evento'):
        evento = request.POST['evento'].strip()
        
        if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
            if request.POST['valor'].strip() == '':
                valor = 0
            else:
                try:
                    valor = float(request.POST['valor'].strip().replace(',', '.'))
                except:
                    request.session['aviso'] = 'Valor inválido'
                    return HttpResponseRedirect('/')
        
            dia = Dia_funcionamento(aberto=datetime.now(), fechado=None, evento=evento, valor_inicial = valor)
            dia.save()
            
            Evento(usuario = request.user, data = datetime.now(), pedido = None, descricao = 'Abriu caixa').save()

    return HttpResponseRedirect('/')

@login_required
@permission_required('restaurante.fechar_caixa')
def fechar_caixa(request):
    if Dia_funcionamento.objects.filter(fechado=None).count() > 0:
        
        # Verificar se há pedidos em aberto
        pedido = Pedido.objects.filter(fechado = None)
        if pedido.count() > 0:
            set_mensagem("Há pedido(s) em aberto. Para encerrar o caixa é necessário fechar todos os pedidos.", tipo = 'danger', fixed = None, request = request)
            return HttpResponseRedirect('/')
        
        dia = Dia_funcionamento.objects.get(fechado = None)
        dia.fechado = datetime.now()
        dia.save()
        
        Evento(usuario = request.user, pedido = None, descricao = 'Fechou Caixa').save()
        
        return HttpResponseRedirect('/relatorio/dia/' + str(dia.id) + '/')
    
        '''
        ENCERROU. AGORA É DIRECIONADO PARA OUTRA TELA
        '''
        
        # morreu daqui pra baixo
        pedido = None
        
        # imprimir total apurado do dia
        dia = Dia_funcionamento.objects.get(fechado = None)
        pedidos = Pedido.objects.filter(aberto__gt = dia.aberto)
        
        mesas = Mesa.objects.all()
        total_mesa = {}
        
        for mesa in mesas:
            total_mesa[mesa.id] = 0.0
        
        # total_entrega = 0.0
        # total_balcao = 0.0
        
        total = 0.0
        
        for pedido in pedidos:
            if pedido.desconto == '0':
                pedido.desconto = 0.0
            
            total_mesa[pedido.mesa_id] += (float(pedido.total) - float(pedido.desconto))
            
#                 if pedido.mesa.tipo == 1:
#                     total_mesa_10[ ((int(pedido.mesa.id) - 1) / 10) + 1 ] = float(total_mesa_10[ ((int(pedido.mesa.id) - 1) / 10) + 1 ]) + (float(pedido.total) - float(pedido.desconto))
#                 elif pedido.mesa.tipo == 2:
#                     total_entrega = float(total_entrega) + (float(pedido.total) - float(pedido.desconto))
#                 elif pedido.mesa.tipo == 3:
#                     total_balcao = float(total_balcao) + (float(pedido.total) - float(pedido.desconto))
            
            total += (float(pedido.total) - float(pedido.desconto))
        
        # imprime
        saida = ""
        if dia.evento != '':
            saida += dia.evento.center(dia.setor.destino.colunas) + '\n\n'
        
        # inclui total de mesas
        total_das_mesas = 0
        for mesa in mesas:
            if total_mesa[mesa.id] > 0 and mesa.tipo == 1:
                total_das_mesas = float(total_das_mesas) + float(total_mesa[mesa.id])
                saida += ((unicode(mesa) + ': R$ ') +  ("%10.2f" % total_mesa[mesa.id]).replace('.', ',')).rjust(dia.setor.destino.colunas) + '\n'
        
        if total_das_mesas > 0:
            saida += dia.setor.destino.colunas * '-' + '\n'
            saida += (('Total das mesas: R$ ') +  ("%10.2f" % total_das_mesas).replace('.', ',')).rjust(dia.setor.destino.colunas) + '\n'
            saida += dia.setor.destino.colunas * '-' + '\n'
        
        # inicio gambiarra
        # saida += 'Total das mesas\n'
        
        for i in range(10):
            pass # saida += 'Mesas %.3d a %.3d - R$ %.2f\n' % (i*10 + 1, i*10 + 10,  total_mesa_10[i+1])
        
#             saida += (('Entregas: R$ ') +  ("%10.2f" % total_entrega).replace('.', ',')).rjust(dia.setor.destino.colunas) + '\n'
#             saida += (('Balcao: R$ ') +  ("%10.2f" % total_balcao).replace('.', ',')).rjust(dia.setor.destino.colunas) + '\n'
        # fim gambiarra
        
        saida += dia.setor.destino.colunas * '-' + '\n'
        saida += (('Total apurado do dia: R$ ') +  ("%10.2f" % total).replace('.', ',')).rjust(dia.setor.destino.colunas)
        
        dia.fechado = datetime.now()
        dia.save()
        
        Evento(usuario = request.user, pedido = None, descricao = 'Fechou Caixa').save()
        
        impressao.views.imprime_caixa(saida, dia.setor.destino)
        
        # mensagem
        set_mensagem("Caixa fechado com sucesso.", tipo = 'success', fixed = None, request = request)
            
    return logout_view(request)

@login_required
def logout_view(request):
    logout(request)
    return HttpResponseRedirect('/')

def set_mensagem(mensagem = None, titulo = None, tipo = None, fixed = 'top', request = None):
    if mensagem and request:
        if titulo:
            request.session['mensagem_titulo'] = titulo
        else:
            if request.session.has_key('mensagem_titulo'):
                del request.session['mensagem_titulo']
        
        request.session['mensagem'] = mensagem
        
        if tipo:
            request.session['mensagem_tipo'] = tipo
        else:
            if request.session.has_key('mensagem_tipo'):
                del request.session['mensagem_tipo']
        
        if fixed:
            request.session['mensagem_fixed'] = fixed
        else:
            if request.session.has_key('mensagem_fixed'):
                del request.session['mensagem_fixed']

def mensagem(request, l):
    if l and isinstance(l, dict):
        if request.session.has_key('mensagem'):
            l['mensagem'] = request.session['mensagem']
            del request.session['mensagem']
            if request.session.has_key('mensagem_titulo'):
                l['mensagem_titulo'] = request.session['mensagem_titulo']
                del request.session['mensagem_titulo']
            
            if request.session.has_key('mensagem_tipo'):
                l['mensagem_tipo'] = request.session['mensagem_tipo']
                del request.session['mensagem_tipo']
            
            if request.session.has_key('mensagem_fixed'):
                l['mensagem_fixed'] = request.session['mensagem_fixed']
                del request.session['mensagem_fixed']
        else:
            l['mensagem'] = False

def novo_pedido(dia, mesa, usuario):
    pedido = Pedido(dia = dia, mesa = mesa, usuario = usuario)
    pedido.save()
    Evento(usuario = usuario, pedido = pedido, descricao = u"Novo pedido criado").save()
    return pedido

@login_required
def mesas2(request):
    # CHECAR SEMPRE
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
    dia = Dia_funcionamento.objects.get(fechado=None)
    
    if Dados.objects.all().count() > 0:
        dados = Dados.objects.all()[0]
    else:
        return HttpResponseRedirect('/admin/configuracao/dados/add/')
    # END CHECAR SEMPRE
    
    if request.GET.has_key('id'):
        mesa_id = request.GET['id'].strip()
        if mesa_id.isdigit():
            mesa_id = int(mesa_id)
            if Mesa.objects.filter(id = mesa_id).count() == 1:
                mesa = Mesa.objects.get(pk = mesa_id)
                if Pedido.objects.filter(mesa = mesa, fechado = None).count() == 1:
                    pedido = Pedido.objects.get(mesa = mesa, fechado = None)
                    return HttpResponseRedirect('/pedido/?id=' + str(pedido.id))
                else:
                    # cria novo pedido
                    pedido = novo_pedido(dia, mesa, request.user)
                    return HttpResponseRedirect('/pedido/produto/?id=' + str(pedido.id))
                    
            else:
                set_mensagem("Mesa inexistente.", tipo = 'danger', fixed = None, request = request)
        else:
            set_mensagem("Mesa inexistente.", tipo = 'danger', fixed = None, request = request)
    
    mesas = Mesa.objects.filter(tipo = 1)
    pedidos = Pedido.objects.filter(fechado = None)
    for mesa in mesas:
        if pedidos.filter(mesa = mesa).count() == 1:
            mesa.estado = 1
    
#     if Direcionamento.objects.filter(usuario = request.user, atual = request.path, link = '/').count() > 0:
#         direcionamento_mesa = Direcionamento.objects.get(usuario = request.user, atual = request.path, link = '/')
#     class Direcionamento:
#         pass
#     
#     direcionamento_mesa = Direcionamento()
#     direcionamento_mesa.usuario = request.user
#     direcionamento_mesa.atual = '/'
#     direcionamento_mesa.link = '/'
#     direcionamento_mesa.proxima = '/pedido/produto/'
#     direcionamento_mesa.anterior = '/'
    
    titulo = 'Mesas'
    mensagem(request, locals())
    
    return render_to_response('restaurante/mesa2.html',locals(),
        context_instance=RequestContext(request))

def marcar_excluido(pedido, itens, request):
    for item in itens:
        pedido.total = float(pedido.total) - int(item.quantidade) * float(item.produto.preco_de_venda)
        pedido.save()
        item.produto.quantidade = int(item.produto.quantidade) + int(item.quantidade)
        item.produto.quantidade_vendida = int(item.produto.quantidade_vendida) - int(item.quantidade)
        item.produto.save()
        item.produto.categoria.quantidade_vendida = int(item.produto.categoria.quantidade_vendida) - int(item.quantidade)
        item.produto.categoria.save()
        item.estado = 0
        item.save()
    
    Evento(usuario = request.user, pedido = pedido, descricao = u"Itens excluídos").save()

def marcar_pago(pedido, itens, request):
    for item in itens:
        if item.estado == 2:
            item.estado = 4
        elif item.estado == 4:
            item.estado = 2
        item.save()
    
    Evento(usuario = request.user, pedido = pedido, descricao = u"Itens marcados como pago").save()

def marcar_gratuito(pedido, itens, request):
    for item in itens:
        if item.estado == 2:
            item.estado = 3
            pedido.total = float(pedido.total) - int(item.quantidade) * float(item.produto.preco_de_venda)
            pedido.save()
        elif item.estado == 3:
            item.estado = 2
            pedido.total = float(pedido.total) + int(item.quantidade) * float(item.produto.preco_de_venda)
            pedido.save()
        item.save()
    
    Evento(usuario = request.user, pedido = pedido, descricao = u"Itens marcados como gratuito").save()
        
def outra_mesa(pedido, itens, mesa, request):
    if itens.filter(estado__in = [0, 1, 4]).count() > 0:
        return
    
    if mesa != pedido.mesa:
        marcar_excluido(pedido, itens, request)
        _ = pedido
        
        if Pedido.objects.filter(mesa = mesa, fechado = None).count() == 1:
            pedido = Pedido.objects.get(mesa = mesa, fechado = None)
        else:
            # cria novo pedido
            pedido = novo_pedido(pedido.dia, mesa, request.user)
        
        for item in itens:
            item = adicionar_item_(item.quantidade, item.produto.codigo, pedido, request)
            item.estado = 2
            item.save()
            
            pedido.total = float(pedido.total) + int(item.quantidade) * float(item.produto.preco_de_venda)
            pedido.save()
            
        Evento(usuario = request.user, pedido = pedido, descricao = u"Itens enviados de " + str(_.mesa) + ' para ' + str(mesa)).save()

@login_required
def pedido2(request):
    # CHECAR SEMPRE
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
    dia = Dia_funcionamento.objects.get(fechado=None)
    
    if Dados.objects.all().count() > 0:
        dados = Dados.objects.all()[0]
    else:
        return HttpResponseRedirect('/admin/configuracao/dados/add/')
    # END CHECAR SEMPRE
    
    if request.method == "POST":
        try:
            pedido = Pedido.objects.get(id = int(request.GET['id']), fechado = None)
        except:
            set_mensagem("Pedido inexistente.", tipo = 'danger', fixed = None, request = request)
            return HttpResponseRedirect('/')
        
        itens = map(int, request.POST.getlist('itens[]'))
        itens = Item.objects.filter(id__in = itens, estado__in = [2, 3, 4])
        opcao = int(request.POST['opcao'])
        
        if opcao == 1: # excluir itens
            marcar_excluido(pedido, itens, request)
        elif opcao == 2: # enviar itens para outra mesa
            mesa = Mesa.objects.get(id = int(request.POST['mesa']))
            outra_mesa(pedido, itens, mesa, request)
        elif opcao == 3: # marcar como pago
            marcar_pago(pedido, itens, request)
        elif opcao == 4: # marcar gratuito
            marcar_gratuito(pedido, itens, request)
        else:
            set_mensagem("Opção desconhecida.", tipo = 'danger', fixed = None, request = request)
        
    
    if request.GET.has_key('id'):
        pedido_id = request.GET['id'].strip()
        if pedido_id.isdigit():
            pedido_id = int(pedido_id)
            if Pedido.objects.filter(id = pedido_id).count() == 1:
                pedido = Pedido.objects.get(pk = pedido_id)
                
                mesas = Mesa.objects.filter(tipo = 1)
                pedido.itens = Item.objects.filter(pedido = pedido, estado__in = [0, 2, 3, 4])
                for item in pedido.itens:
                    item.total = item.quantidade * item.produto.preco_de_venda
            else:
                set_mensagem("Pedido inexistente.", tipo = 'danger', fixed = None, request = request)
                return HttpResponseRedirect('/')
        else:
            set_mensagem("Pedido inexistente.", tipo = 'danger', fixed = None, request = request)
            return HttpResponseRedirect('/')
    else:
        return HttpResponseRedirect('/')
    
    titulo = pedido.mesa
    mensagem(request, locals())
    
    return render_to_response('restaurante/pedido2.html',locals(),
        context_instance=RequestContext(request))

def adicionar_item_(quantidade, codigo, pedido, request):
    if Produto.objects.filter(codigo = codigo).count() > 0:
        produto = Produto.objects.get(codigo = codigo)
        
        if produto.quantidade >= quantidade:
            produto.quantidade = int(produto.quantidade) - int(quantidade)
            produto.quantidade_vendida = int(produto.quantidade_vendida) + int(quantidade)
            produto.categoria.quantidade_vendida = int(produto.categoria.quantidade_vendida) + int(quantidade)
            produto.categoria.save()
            produto.save()
            
            item = Item(pedido = pedido, produto = produto, quantidade = quantidade)
            item.save()
            
#             pedido.total = float(pedido.total) + int(quantidade) * float(produto.preco_de_venda)
#             pedido.save()
            
#             Evento(usuario = request.user, pedido = pedido, descricao = u"Adicionou item pelo código. %s - %dx %s" % (item.produto.codigo, item.quantidade, item)).save()
            
            return item
        else:
            set_mensagem("Item NÃO incluído. Quantidade em estoque: " + str(produto.quantidade), tipo = 'danger', fixed = None, request = request)
            return None
    else:
        set_mensagem("Código de produto não encontrado.", tipo = 'danger', fixed = None, request = request)
        return None

@login_required
def excluir(request):
    # CHECAR SEMPRE
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
    dia = Dia_funcionamento.objects.get(fechado=None)
    
    if Dados.objects.all().count() > 0:
        dados = Dados.objects.all()[0]
    else:
        return HttpResponseRedirect('/admin/configuracao/dados/add/')
    # END CHECAR SEMPRE
    
    if request.GET.has_key('id'):
        pedido_id = request.GET['id'].strip()
        if pedido_id.isdigit():
            pedido_id = int(pedido_id)
            if Pedido.objects.filter(id = pedido_id).count() == 1:
                pedido = Pedido.objects.get(pk = pedido_id)
                
                if request.GET.has_key('item'):
                    try:
                        item = int(request.GET['item'].strip())
                        if Item.objects.filter(id = item, estado = 1):
                            item = Item.objects.get(id = item, estado = 1)
                            item.delete()
                        else:
                            set_mensagem("Item inexistente.", tipo = 'danger', fixed = None, request = request)
                        return HttpResponseRedirect('/pedido/produto/?id=' + str(pedido.id))
                    except:
                        set_mensagem("Item inexistente.", tipo = 'danger', fixed = None, request = request)
                else:
                    return HttpResponseRedirect('/pedido/?id=' + str(pedido.id))
                
                
                return HttpResponseRedirect('/')
            else:
                set_mensagem("Pedido inexistente.", tipo = 'danger', fixed = None, request = request)
                return HttpResponseRedirect('/')
        else:
            set_mensagem("Pedido inexistente.", tipo = 'danger', fixed = None, request = request)
            return HttpResponseRedirect('/')
    else:
        return HttpResponseRedirect('/')

@login_required
def cancelar(request):
    # CHECAR SEMPRE
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
    dia = Dia_funcionamento.objects.get(fechado=None)
    
    if Dados.objects.all().count() > 0:
        dados = Dados.objects.all()[0]
    else:
        return HttpResponseRedirect('/admin/configuracao/dados/add/')
    # END CHECAR SEMPRE
    
    if request.GET.has_key('id'):
        pedido_id = request.GET['id'].strip()
        if pedido_id.isdigit():
            pedido_id = int(pedido_id)
            if Pedido.objects.filter(id = pedido_id).count() == 1:
                pedido = Pedido.objects.get(pk = pedido_id)
                
                pedido.itens = Item.objects.filter(pedido = pedido, estado__in = [1])
                pedido.itens.delete()
                
                return HttpResponseRedirect('/')
            else:
                set_mensagem("Pedido inexistente.", tipo = 'danger', fixed = None, request = request)
                return HttpResponseRedirect('/')
        else:
            set_mensagem("Pedido inexistente.", tipo = 'danger', fixed = None, request = request)
            return HttpResponseRedirect('/')
    else:
        return HttpResponseRedirect('/')

@login_required
def confirmar(request):
    # CHECAR SEMPRE
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
    dia = Dia_funcionamento.objects.get(fechado=None)
    
    if Dados.objects.all().count() > 0:
        dados = Dados.objects.all()[0]
    else:
        return HttpResponseRedirect('/admin/configuracao/dados/add/')
    # END CHECAR SEMPRE
    
    nome = str(request.user)
    if request.user.first_name:
        nome = request.user.first_name
    
    if request.GET.has_key('id'):
        pedido_id = request.GET['id'].strip()
        if pedido_id.isdigit():
            pedido_id = int(pedido_id)
            if Pedido.objects.filter(id = pedido_id).count() == 1:
                pedido = Pedido.objects.get(pk = pedido_id)
                
                pedido.itens = Item.objects.filter(pedido = pedido, estado__in = [1])
                setores = Setor.objects.all()
                
                lista_imprimir = {}
                
                for setor in setores:
                    lista_imprimir[setor.nome_setor] = []
                
                for item in pedido.itens:
                    lista_imprimir[item.produto.setor.nome_setor].append(item)
                    item.estado = 2
                    item.usuario = request.user
                    item.save()
                    
                    pedido.total = float(pedido.total) + int(item.quantidade) * float(item.produto.preco_de_venda)
                    pedido.save()
                    
                    Evento(usuario = request.user, pedido = pedido, descricao = "Confirmou Pedido").save()
                
                for lista in lista_imprimir:
                    alista = lista_imprimir[lista]
                    if len(alista) > 0:
                        setor = alista[0].produto.setor
                        
                        if setor.destino != None and setor.notificar == 1:
                            saida = datetime.now().strftime('%d/%m/%Y - %H:%M:%S') + ' - ' + unicode(nome) + '\n'
                            saida += (str(pedido.mesa) + ' - ' + str(pedido) + '. Entrada: '+ str(pedido.aberto.strftime('%H:%M:%S'))).ljust(setor.destino.colunas) + '\n'
                            if pedido.cliente:
                                saida += 'Cliente: ' + str(pedido.cliente) + '\n'
                            saida += '-'* setor.destino.colunas + '\n'
                            saida += "Quant Descricao                      Cod    \n"
                            saida += '-' * setor.destino.colunas + '\n'
                            for item in alista:
                                saida += str(int(item.quantidade)).zfill(2).ljust(5) + ' ' + item.produto.descricao_impressao.ljust(30) + ' ' + str(item.produto.codigo).replace('.', ',').ljust(5) + '\n'
                                
                                if item.observacao != None and item.observacao != "":
                                    saida += 'Obs.: ' + item.observacao + '\n\n'
                            
                            impressao.views.imprime_caixa(saida, setor.destino, setor.nome_setor, '')
                    
                    return HttpResponseRedirect('/')
            else:
                set_mensagem("Pedido inexistente.", tipo = 'danger', fixed = None, request = request)
                return HttpResponseRedirect('/')
        else:
            set_mensagem("Pedido inexistente.", tipo = 'danger', fixed = None, request = request)
            return HttpResponseRedirect('/')
    else:
        return HttpResponseRedirect('/')
    
    

@login_required
def produto(request):
    # CHECAR SEMPRE
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
    dia = Dia_funcionamento.objects.get(fechado=None)
    
    if Dados.objects.all().count() > 0:
        dados = Dados.objects.all()[0]
    else:
        return HttpResponseRedirect('/admin/configuracao/dados/add/')
    # END CHECAR SEMPRE
    
    if request.method == 'POST':
        if Pedido.objects.filter(id = int(request.GET['id'].strip()), fechado = None).count() == 1:
            pedido = Pedido.objects.get(id = int(request.GET['id'].strip()), fechado = None)
            
            try:
                quantidade = int(request.POST['quantidade'].strip())
                
                codigo = request.POST['codigo'].strip().split(' - ')[0]
                
                if (adicionar_item_(quantidade, codigo, pedido, request)):
                    quantidade = 1
                    codigo = ''
            except:
                set_mensagem("Quantidade inválida.", tipo = 'danger', fixed = None, request = request)
        else:
            set_mensagem("Pedido inválido.", tipo = 'danger', fixed = None, request = request)
            return HttpResponseRedirect('/')
        
        
    
    if request.GET.has_key('id'):
        pedido_id = request.GET['id'].strip()
        if pedido_id.isdigit():
            pedido_id = int(pedido_id)
            if Pedido.objects.filter(id = pedido_id).count() == 1:
                pedido = Pedido.objects.get(pk = pedido_id)
                
                pedido.itens = Item.objects.filter(pedido = pedido, estado__in = [1])
                pedido.total = 0
                for item in pedido.itens:
                    item.total = item.quantidade * item.produto.preco_de_venda
                    pedido.total += item.total
            else:
                set_mensagem("Pedido inexistente.", tipo = 'danger', fixed = None, request = request)
                return HttpResponseRedirect('/')
        else:
            set_mensagem("Pedido inexistente.", tipo = 'danger', fixed = None, request = request)
            return HttpResponseRedirect('/')
    else:
        return HttpResponseRedirect('/')
    
    produtos = Produto.objects.all()
    titulo = pedido.mesa
    mensagem(request, locals())
    prev = '/pedido/?id=' + str(pedido.id)
    
    return render_to_response('restaurante/produto.html',locals(),
        context_instance=RequestContext(request))

def computar_pedido(pedido):
    if pedido.taxa_servico:
        pedido.taxa_servico = float(pedido.total) * float(pedido.mesa.porcentagem) / 100.
    
    pedido.desconto = float(pedido.desconto)
    
    pedido.pagamentos = Pagamento_parcial.objects.filter(pedido = pedido)
    pedido.total_pago = 0.0
    for pagamento in pedido.pagamentos:
        if pagamento.estado == 1:
            pedido.total_pago = float(pedido.total_pago) + float(pagamento.valor)
        
        if pagamento.tipo == 0:
            pagamento.tipo = 'dinheiro'
        elif pagamento.tipo == 1:
            pagamento.tipo = 'débito'
        elif pagamento.tipo == 2:
            pagamento.tipo = 'cartão'
        elif pagamento.tipo == 3:
            pagamento.tipo = 'cheque'
        elif pagamento.tipo == 4:
            pagamento.tipo = 'crediário'
    
    pedido.valor_final = round(float(pedido.total) + pedido.taxa_servico - pedido.desconto - pedido.total_pago, 2)
    
    if pedido.valor_final < 0:
        pedido.troco = abs(pedido.valor_final)
        pedido.valor_final = 0
    elif pedido.valor_final == 0:
        pedido.valor_final = 0
    
    pedido.subtotal = pedido.total
    pedido.total = float(pedido.total) + pedido.taxa_servico - pedido.desconto
    
    return pedido

@permission_required('restaurante.ver_pagamento')
@login_required
def pagamento(request):
    # CHECAR SEMPRE
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
    dia = Dia_funcionamento.objects.get(fechado=None)
    
    if Dados.objects.all().count() > 0:
        dados = Dados.objects.all()[0]
    else:
        return HttpResponseRedirect('/admin/configuracao/dados/add/')
    # END CHECAR SEMPRE
    
    if request.GET.has_key('id'):
        pedido_id = request.GET['id'].strip()
        if pedido_id.isdigit():
            pedido_id = int(pedido_id)
            if Pedido.objects.filter(id = pedido_id).count() == 1:
                pedido = Pedido.objects.get(pk = pedido_id)
                
                pedido = computar_pedido(pedido)
                
            else:
                set_mensagem("Pedido inexistente.", tipo = 'danger', fixed = None, request = request)
        else:
            set_mensagem("Pedido inexistente.", tipo = 'danger', fixed = None, request = request)
    else:
        return HttpResponseRedirect('/')
    
    titulo = pedido.mesa
    mensagem(request, locals())
    prev = '/pedido/?id=' + str(pedido.id)
    
    return render_to_response('restaurante/pagamento.html',locals(),
        context_instance=RequestContext(request))

@login_required
def pagamento_adicionar(request):
    # CHECAR SEMPRE
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
    dia = Dia_funcionamento.objects.get(fechado=None)
    
    if Dados.objects.all().count() > 0:
        dados = Dados.objects.all()[0]
    else:
        return HttpResponseRedirect('/admin/configuracao/dados/add/')
    # END CHECAR SEMPRE
    
    if request.GET.has_key('id'):
        pedido_id = request.GET['id'].strip()
        if pedido_id.isdigit():
            pedido_id = int(pedido_id)
            if Pedido.objects.filter(id = pedido_id).count() == 1:
                pedido = Pedido.objects.get(pk = pedido_id)
                pedido = computar_pedido(pedido)
                
                if request.POST['valor'].strip() == "":
                    valor = pedido.valor_final
                else:
                    try:
                        valor = abs(float(request.POST['valor'].strip().replace(',', '.')))
                    except:
                        set_mensagem("Valor inválido.", tipo = 'danger', fixed = None, request = request)
                        return HttpResponseRedirect('/pedido/pagamento/?id=' + str(pedido.id))
                
                tipo_pagamento = int(request.POST['tipo'])
                
                Pagamento_parcial(pedido = pedido, valor = valor, tipo = tipo_pagamento).save()
                Evento(usuario = request.user, pedido = pedido, descricao = u"Pagamento por tipo: " + str(tipo_pagamento) + " valor: R$ " + str(valor)).save()
                
                if tipo_pagamento == 0:
                    dia.dinheiro = float(dia.dinheiro) + float(valor)
                elif tipo_pagamento == 1:
                    dia.debito = float(dia.debito) + float(valor)
                elif tipo_pagamento == 2:
                    dia.cartao = float(dia.cartao) + float(valor)
                elif tipo_pagamento == 3:
                    dia.cheque = float(dia.cheque) + float(valor)
                elif tipo_pagamento == 4:
                    dia.crediario = float(dia.crediario) + float(valor)
                
                dia.save()
                
                return HttpResponseRedirect('/pedido/pagamento/?id=' + str(pedido.id))
                
            else:
                set_mensagem("Pedido inexistente.", tipo = 'danger', fixed = None, request = request)
        else:
            set_mensagem("Pedido inexistente.", tipo = 'danger', fixed = None, request = request)
    else:
        return HttpResponseRedirect('/')

@login_required
def pagamento_excluir_(request):
    # CHECAR SEMPRE
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
    dia = Dia_funcionamento.objects.get(fechado=None)
    
    if Dados.objects.all().count() > 0:
        dados = Dados.objects.all()[0]
    else:
        return HttpResponseRedirect('/admin/configuracao/dados/add/')
    # END CHECAR SEMPRE
    
    if request.GET.has_key('id'):
        pedido_id = request.GET['id'].strip()
        if pedido_id.isdigit():
            pedido_id = int(pedido_id)
            if Pedido.objects.filter(id = pedido_id).count() == 1:
                pedido = Pedido.objects.get(pk = pedido_id)
                pedido = computar_pedido(pedido)
                
                if not request.GET.has_key('p'):
                    return HttpResponseRedirect('/pedido/pagamento/?id=' + str(pedido.id))
                
                try:
                    pagamento = Pagamento_parcial.objects.get(pedido = pedido, id = request.GET['p'], estado = 1)
                except:
                    set_mensagem("Pagamento inválido.", tipo = 'danger', fixed = None, request = request)
                    return HttpResponseRedirect('/pedido/pagamento/?id=' + str(pedido.id))
                
                tipo_pagamento = pagamento.tipo
                valor = pagamento.valor
                
                if tipo_pagamento == 0:
                    dia.dinheiro = float(dia.dinheiro) - float(valor)
                elif tipo_pagamento == 1:
                    dia.debito = float(dia.debito) - float(valor)
                elif tipo_pagamento == 2:
                    dia.cartao = float(dia.cartao) - float(valor)
                elif tipo_pagamento == 3:
                    dia.cheque = float(dia.cheque) - float(valor)
                elif tipo_pagamento == 4:
                    dia.crediario = float(dia.crediario) - float(valor)
                
                pagamento.estado = 0
                pagamento.save()
                dia.save()
                
                Evento(usuario = request.user, pedido = pedido, descricao = u"Excluiu pagamento " + unicode(pagamento)).save()
                return HttpResponseRedirect('/pedido/pagamento/?id=' + str(pedido.id))
                
            else:
                set_mensagem("Pedido inexistente.", tipo = 'danger', fixed = None, request = request)
        else:
            set_mensagem("Pedido inexistente.", tipo = 'danger', fixed = None, request = request)
    else:
        return HttpResponseRedirect('/')


@login_required
@permission_required('restaurante.alterar_mesa')
def pedido_alterar_mesa2(request):
    # CHECAR SEMPRE
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
    dia = Dia_funcionamento.objects.get(fechado=None)
    
    if Dados.objects.all().count() > 0:
        dados = Dados.objects.all()[0]
    else:
        return HttpResponseRedirect('/admin/configuracao/dados/add/')
    # END CHECAR SEMPRE
    
    if request.GET.has_key('id'):
        pedido_id = request.GET['id'].strip()
        if pedido_id.isdigit():
            pedido_id = int(pedido_id)
            if Pedido.objects.filter(id = pedido_id).count() == 1:
                pedido = Pedido.objects.get(pk = pedido_id)
                mesas = Mesa.objects.all()
                
                if request.method == "POST":
                    pass
                
            else:
                set_mensagem("Pedido inexistente.", tipo = 'danger', fixed = None, request = request)
        else:
            set_mensagem("Pedido inexistente.", tipo = 'danger', fixed = None, request = request)
    else:
        return HttpResponseRedirect('/')
    
    titulo = pedido.mesa
    mensagem(request, locals())
    prev = '/pedido/?id=' + str(pedido.id)
    
    return render_to_response('restaurante/pedido/alterar_mesa.html',locals(),
        context_instance=RequestContext(request))
    
    
    

@login_required
def mesas(request):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
    
    mesas = Mesa.objects.all()
    usuarios = User.objects.filter(is_active = True)
    quantidades = range(1, 100)
    produtos = Produto.objects.all().order_by('descricao')
    
    if request.method == "POST":
        mesa_id = int(request.POST["mesa_id"])
        usuario_id = int(request.POST["usuario_id"])
        quantidade = int(request.POST['quantidade'])
        codigo = int(request.POST['codigo'])
        
        if mesa_id != 0 and usuario_id != 0 and quantidade != 0 and codigo != 0:
            mesa = Mesa.objects.get(id = mesa_id)
            usuario = User.objects.get(id = usuario_id)
            produto = Produto.objects.get(codigo = codigo)
            
            if Pedido.objects.filter(mesa = mesa, fechado = None).count() == 1:
                pedido = Pedido.objects.get(mesa = mesa, fechado = None)
            else:
                pedido = Pedido(dia = Dia_funcionamento.objects.get(fechado=None), mesa = mesa, total = 0, aberto=datetime.now(), fechado = None, usuario = request.user)
                pedido.save()
                
                Evento(usuario = request.user, pedido = pedido, descricao = 'Abriu pedido').save()
            
            if produto.quantidade < int(quantidade):
                request.session['aviso'] = u"Item NÃO incluído. Quantidade em estoque: "+ str(produto.quantidade)
                return HttpResponseRedirect('/')
            
            produto.quantidade -= int(quantidade)
            produto.quantidade_vendida += int(quantidade)
            produto.categoria.quantidade_vendida += int(quantidade)
            produto.categoria.save()
            produto.save()
            
            item = Item(pedido_id=pedido.id, produto_id=produto.id, quantidade=quantidade, data = datetime.now(), usuario = usuario)
            item.save()
            
            pedido.total = float(pedido.total) + (int(item.quantidade) * float(item.produto.preco_de_venda))
            pedido.save()
            
            Evento(usuario = request.user, pedido = pedido, descricao = u"Adicionou item pelo código da tela de mesas. %s - %dx %s" % (item.produto.codigo, item.quantidade, item)).save()
            
            if int(item.quantidade) == 1:
                request.session['mensagem'] = u"Item incluído."
                request.session['aviso'] = u"VOCÊ AINDA PRECISA CONFIRMAR OS ITENS ADICIONADOS. <a href=\"/pedido/" + str(mesa.id) + "\">" + str(mesa) + "</a>"
            else:
                request.session['mensagem'] = str(item.quantidade) + u" Itens incluídos."
                request.session['aviso'] = u"VOCÊ AINDA PRECISA CONFIRMAR OS ITENS ADICIONADOS. <a href=\"/pedido/" + str(mesa.id) + "\">" + str(mesa) + "</a>"
        else:
            request.session['aviso'] = 'Valores inválidos'
        
            
    
        
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']

    lista_mesas = Mesa.objects.filter(tipo = 1)
    pedidos = Pedido.objects.filter(fechado = None)
    
    for mesa in lista_mesas:
        pedido = pedidos.filter(mesa=mesa.id)
        if len(pedido) != 0:
            mesa.pedido = pedido[0]
            mesa.itens = Item.objects.filter(pedido_id=mesa.pedido.id, estado = 1).count()
            
            if mesa.pedido.taxa_servico:
                taxa = float(mesa.pedido.total) * (float(mesa.porcentagem) / 100.)
            else:
                taxa = 0.0
            
            mesa.pedido.total = round(float(mesa.pedido.total) + float(taxa), 2)
            
            #Calculando desconto
            if mesa.pedido.desconto != '':
                mesa.pedido.total = (float(mesa.pedido.total) - float(mesa.pedido.desconto))
                
            #calculando valor pago
            pagamento_parcial = Pagamento_parcial.objects.filter(pedido_id = mesa.pedido.id, estado = 1)
            valor_pago = 0.0
            for pagamento in pagamento_parcial:
                valor_pago += float(pagamento.valor)
            
            mesa.pedido.total = float(mesa.pedido.total) - valor_pago
            mesa.pedido.total = str("%.2f" % round(mesa.pedido.total, 2)).replace('.', ',')
    
    css = 'restaurante/mesas'
    js = 'restaurante/mesa'
    # header = 'Mesas'
    return render_to_response('restaurante/mesa.html',locals(),
        context_instance=RequestContext(request))

@login_required
@permission_required("restaurante.novo_pedido")
def pedido(request, mesa_id):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
        
    if Mesa.objects.filter(id = mesa_id):
        mesa = Mesa.objects.get(id=mesa_id)
        
        if Pedido.objects.filter(mesa = mesa, fechado = None).count() == 1:
            pedido = Pedido.objects.get(mesa = mesa, fechado = None)
        else:
            pedido = Pedido(dia = Dia_funcionamento.objects.get(fechado=None), mesa = mesa, total = 0, aberto=datetime.now(), fechado = None, usuario = request.user)
            pedido.save()
            
            Evento(usuario = request.user, pedido = pedido, descricao = 'Abriu pedido').save()
    else:
        mensagem = 'Mesa informada não existe'
        return render_to_response('restaurante/aviso.html', locals(),
            context_instance=RequestContext(request))
    
    lista_itens = Item.objects.filter(pedido_id=pedido.id)
    itens = Item.objects.filter(pedido_id=pedido.id, estado__gt = 0).count()
    
    lista_abertos = Item.objects.filter(pedido_id = pedido.id, estado = 1)
    abertos = lista_abertos.count()
    
    
    for item in lista_itens:
        item.valor_total = item.quantidade * item.produto.preco_de_venda
    
    total = float(pedido.total)
    
    #Calculando desconto
    if pedido.desconto != '0':
        total = (float(pedido.total) - round(float(pedido.desconto), 2))
        
    #calculando 
    pagamento_parcial = Pagamento_parcial.objects.filter(pedido_id = pedido.id)
    valor_pago = 0.0
    for pagamento in pagamento_parcial:
        if pagamento.estado == 1:
            valor_pago += float(pagamento.valor)
    
    total -= round(valor_pago, 2)
    
    
    if pedido.taxa_servico:
        taxa = float(pedido.total) * (float(pedido.mesa.porcentagem) / 100.)
        total = float(total) + round(float(taxa), 2)
    
    total = round(total, 2)
    print total
    
    if total < 0:
        total = float(total) + float(pedido.desconto)
        pedido.desconto = '0'
        pedido.taxa_servico = True
        if pedido.taxa_servico:
            taxa = float(pedido.total) * (float(pedido.mesa.porcentagem) / 100.)
            total = float(total) + float(taxa)
        pedido.save()
    
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
    
    total = float(total)
    total = abs(round(total, 2))
    pedido.total = float(pedido.total)
    
    js = 'restaurante/pedido'
    css = 'restaurante/pedido'
    return render_to_response('restaurante/pedido.html', locals(),
        context_instance=RequestContext(request))

@login_required
@csrf_exempt
@permission_required("restaurante.alterar_pedido")
def adicionar_item_id(request):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
        
    if request.POST.has_key('validar') and request.POST['validar'] == '1':
        mesa_id = int(request.POST['mesa_id'])
        quantidade = request.POST['quantidade']
        codigo = request.POST['codigo']
        
        try:
            produto = Produto.objects.get(codigo=codigo)
        except:
            request.session['aviso'] = 'Código de produto não encontrado'
            return HttpResponseRedirect('/pedido/' + str(mesa_id))
            
        if quantidade.isdigit():
            quantidade = int(quantidade)
            
            if quantidade > 0:
                pedido = Pedido.objects.get(mesa_id = mesa_id, fechado = None)
                
                if produto.quantidade < int(quantidade):
                    request.session['aviso'] = u"Item NÃO incluído. Quantidade em estoque: "+ str(produto.quantidade)
                    return HttpResponseRedirect('/pedido/' + str(mesa_id))
                
                produto.quantidade -= int(quantidade)
                produto.quantidade_vendida += int(quantidade)
                produto.categoria.quantidade_vendida += int(quantidade)
                produto.categoria.save()
                produto.save()
                
                item = Item(pedido_id=pedido.id, produto_id=produto.id, quantidade=quantidade, data = datetime.now())
                item.save()
                
                pedido.total = float(pedido.total) + (int(item.quantidade) * float(item.produto.preco_de_venda))
                pedido.save()
                
                Evento(usuario = request.user, pedido = pedido, descricao = u"Adicionou item pelo código. %s - %dx %s" % (item.produto.codigo, item.quantidade, item)).save()
                
                if int(item.quantidade) == 1:
                    request.session['mensagem'] = u"Item incluído."
                else:
                    request.session['mensagem'] = str(item.quantidade) + u" Itens incluídos."
                    
            else:
                request.session['aviso'] = 'Quantidade inválida'
            
        else:
            request.session['aviso'] = 'Quantidade inválida'
        
        return HttpResponseRedirect('/pedido/' + str(mesa_id))
    else:
        return HttpResponseRedirect('/')

# listar produtos separados por categorias
@login_required
def categorias(request, mesa_id):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
    
    try:
        pedido = Pedido.objects.get(mesa_id = mesa_id, fechado = None)
    except:
        return HttpResponseRedirect('/')        
    
    lista_categorias = Categoria.objects.all().order_by('-quantidade_vendida', 'nome_categoria')
    
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
        
    for categoria in lista_categorias:
        categoria.lista_produtos = Produto.objects.filter(categoria_id = categoria.id).order_by('-quantidade_vendida', 'descricao')

    js = "restaurante/produtos"
    css = "restaurante/produtos"
    return render_to_response('restaurante/produtos.html', locals(),
        context_instance=RequestContext(request))

@csrf_exempt
@login_required
@permission_required("restaurante.alterar_pedido")
def adicionar_item(request):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
        
    mesa_id = request.POST['mesa_id']
    produto_id = request.POST['produto_id']
    quantidade = request.POST['quantidade']
    meda_id = int(mesa_id)
    produto_id = int(produto_id)
    quantidade = int(quantidade)
    
    if int(quantidade) == 0 :
        request.session['aviso'] = "Item NÃO incluído."
        return HttpResponseRedirect('/produtos/' + mesa_id)
    else:
        pedido = Pedido.objects.get(mesa_id = mesa_id, fechado = None)

        produto = Produto.objects.get(id=produto_id)
        if produto.quantidade < int(quantidade):
            request.session['aviso'] = u"Item NÃO incluído. Quantidade em estoque: "+ str(produto.quantidade)
            return HttpResponseRedirect('/produtos/' + mesa_id)
#         produto.quantidade-=int(quantidade)
#         produto.quantidade_vendida += int(quantidade)
#         produto.categoria.quantidade_vendida += int(quantidade)
#         produto.categoria.save()
#         produto.save()
        item = Item(pedido_id=pedido.id, produto_id=produto_id, quantidade=quantidade, data = datetime.now())
        item.save()
        
        Evento(usuario = request.user, pedido = pedido, descricao = u"Adicionou Item. %s - %dx %s" % (item.produto.codigo, item.quantidade, item)).save()

#         pedido.total = float(pedido.total) + (int(item.quantidade) * float(item.produto.preco_de_venda))

        pedido.save()
        
        if int(item.quantidade) == 1:
            request.session['mensagem'] = u"Item incluído."
        else:
            request.session['mensagem'] = str(item.quantidade) + u" Itens incluídos."
        
        return HttpResponseRedirect('/produtos/' + mesa_id)

@login_required
@csrf_exempt
def pedido_cliente(request, pedido_id):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
    
    if request.GET.has_key('next'):
        next = request.GET['next']
    
    if request.POST.has_key('busca'):
        clientes = None
        q = request.POST['q'].strip()
        
        if len(q) > 0:
            clientes = Cliente.objects.filter(Q(nome__icontains = q) | Q(cpf = q))
            clientes = list(clientes)
            
            telefones = Telefone.objects.filter(numero__icontains = q)
            
            for i in telefones:
                clientes += list(Cliente.objects.filter(nome__icontains = i.cliente))
                
            enderecos = Endereco.objects.filter(Q(rua__icontains = q) | Q(cidade__icontains = q) | Q(referencia__icontains = q) | Q(cep__icontains = q))
            for i in enderecos:
                clientes += list(Cliente.objects.filter(nome__icontains = i.cliente))
            
            for i in clientes:
                while clientes.count(i) > 1:
                    clientes.remove(i)
            
            for cliente in clientes:
                cliente.telefones = Telefone.objects.filter(cliente_id = cliente.id)
                cliente.enderecos = Endereco.objects.filter(cliente_id = cliente.id)
    
        if clientes == None or len(clientes) == 0:
            request.session['mensagem'] = u'Não encontramos clientes com a busca por \"' + q + '\".'
    
        
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
        
    return render_to_response('restaurante/pedido_cliente.html', locals(),
        context_instance=RequestContext(request))

@login_required
def pedido_cliente_associar(request, pedido_id, cliente_id):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
        
    if Pedido.objects.filter(id = pedido_id).count() > 0:
        pedido = Pedido.objects.get(id = pedido_id)
        
        if Cliente.objects.filter(id = cliente_id):
            pedido.cliente = Cliente.objects.get(id = cliente_id)
            pedido.save()
            
            Evento(usuario = request.user, pedido = pedido, descricao = 'Cliente associado').save()
            
            if request.GET.has_key('next'):
                next = request.GET['next']
                return HttpResponseRedirect(next)
            
            return HttpResponseRedirect('/pedido/?id=' + str(pedido.id))
            
        else:
            request.session['aviso'] = 'Cliente não existe'
            return HttpResponseRedirect('/')
    else:
        request.session['aviso'] = 'Pedido não existe'
        return HttpResponseRedirect('/')

@csrf_exempt
@login_required
def pedido_entrega_confirmar_endereco(request):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
        
    troco = float(request.POST['troco'].replace(',', '.'))
    endereco_id = int(request.POST['endereco_id'])
    
    if endereco_id > 0:
        endereco = Endereco.objects.get(id = endereco_id)
    else:
        endereco = request.POST['endereco']
    
    pedido_id = request.POST['pedido_id']
    
    pedido = Pedido.objects.get(id = pedido_id)
    itens = Item.objects.filter(pedido_id=pedido.id)
    
    Evento(usuario = request.user, pedido = pedido, descricao = "Imprimiu Entrega").save()
    
    saida = datetime.now().strftime('%d/%m/%Y - %H:%M:%S') + '\n'
    saida += (str(pedido) + ' ' + str(pedido.mesa) + '. Entrada: '+ str(pedido.aberto.strftime('%H:%M:%S'))).ljust(pedido.mesa.setor.destino.colunas) + '\n'
    saida += '-'* pedido.mesa.setor.destino.colunas + '\n'
    saida +=  "    Descricao                      Qt Unit  Total\n"
    saida += '-' * pedido.mesa.setor.destino.colunas + '\n'
    
    i = 0
    for item in itens:
        i += 1
        if item.estado != 0:
            if item.estado == 3:
                saida += str(i).zfill(3).rjust(3) + ' ' + item.produto.descricao_impressao.ljust(30) + ' ' + "--".zfill(2).ljust(2) + ' ' + "----".replace('.', ',').ljust(5) +' ' + "----".rjust(6) + '\n'
            else:
                saida += str(i).zfill(3).rjust(3) + ' ' + item.produto.descricao_impressao.ljust(30) + ' ' + str(int(item.quantidade)).zfill(2).ljust(2) + ' ' + str(item.produto.preco_de_venda).replace('.', ',').ljust(5) +' ' + str("%.2f" % (int(item.quantidade) * float(item.produto.preco_de_venda)) ).replace('.', ',').rjust(6) + '\n'
    
    saida += '-' * pedido.mesa.setor.destino.colunas + '\n'
    
#    saida += ("TOTAL R$ " + str(pedido.total)).rjust(setor.destino.colunas)
    
    saida += ("TOTAL R$ ").rjust(40) + str(pedido.total).rjust(10)
    
    
    if pedido.desconto != '0':
        pedido.desconto = float('%.2f' % float(pedido.desconto))
        total = float('%.2f' % (float(pedido.total) - float(pedido.desconto)))
        
        saida += '\n'
        
#        saida += ('Desconto R$ %.2f' % pedido.desconto).rjust(setor.destino.colunas) + '\n'
        if pedido.desconto > 0:
            saida += ('Desconto RS '.rjust(40)) + ('%.2f' % pedido.desconto).rjust(10) + '\n'  
#        saida += ('VALOR FINAL R$ %.2f' % total).rjust(setor.destino.colunas)
        
        saida += ('VALOR FINAL R$ ').rjust(40) + ('%.2f' % (total)).rjust(10)
        
    saida += '\n' +  '-' * pedido.mesa.setor.destino.colunas + '\n'
    saida += ('Valor Pago R$ ').rjust(40) + ('%.2f' % (total + troco)).rjust(10) + '\n'
    saida += ('Troco R$ ').rjust(40) + ('%.2f' % (troco)).rjust(10)

    saida += '\n' +  '-' * pedido.mesa.setor.destino.colunas + '\n'
    
    saida += 'Dados do cliente'.center(pedido.mesa.setor.destino.colunas) + '\n'
    
    cliente = None
    if pedido.cliente:
        cliente = Cliente.objects.get(id = pedido.cliente_id)
    
    if cliente:
        saida += cliente.nome.center(pedido.mesa.setor.destino.colunas) + '\n\n'
        
        telefones = Telefone.objects.filter(cliente_id = cliente.id)
        if telefones.count() > 0:
            for telefone in telefones:
                saida += unicode(telefone) + '\n'
            saida += '\n'
    
    saida += unicode(endereco) + '\n'
    
    impressao.views.imprime_caixa(saida, pedido.mesa.setor.destino)
    
    request.session['mensagem'] = 'Pedido impresso'
    return HttpResponseRedirect('/')

@csrf_exempt
@login_required
def pedido_pessoas(request, mesa_id):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
        
    pedido = Pedido.objects.get(mesa_id=mesa_id, fechado = None)
    
    if pedido.numero_pessoas == int(request.POST['numero_pessoas']):
        request.session['aviso'] = "O número de pessoas não foi modificado"
    else:
        pedido.numero_pessoas = int(request.POST['numero_pessoas'])
        pedido.save()
        request.session['mensagem'] = "Número de pessoas atualizado"
    
    return HttpResponseRedirect('/pedido/' + mesa_id)

@login_required
def pedido_processar(request, mesa_id):
    nome = str(request.user)
    if request.user.first_name:
        nome = request.user.first_name
    
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
        
    pedido = Pedido.objects.get(mesa_id = mesa_id, fechado = None)
    itens = Item.objects.filter(pedido_id=pedido.id, estado=1)
    setores = Setor.objects.all()
    
    lista_imprimir = {}

    for setor in setores:
        lista_imprimir[setor.nome_setor] = []

    for item in itens:
        lista_imprimir[item.produto.setor.nome_setor].append(item)
        item.estado = 2
        item.usuario = request.user
        item.save()
        
        Evento(usuario = request.user, pedido = pedido, descricao = "Confirmou Pedido").save()
        

    for lista in lista_imprimir:
        alista = lista_imprimir[lista]
        if len(alista) > 0:
            setor = alista[0].produto.setor
            
            if setor.destino != None and setor.notificar == 1:
                saida = datetime.now().strftime('%d/%m/%Y - %H:%M:%S') + ' - ' + unicode(nome) + '\n'
                saida += (str(pedido.mesa) + ' - ' + str(pedido) + '. Entrada: '+ str(pedido.aberto.strftime('%H:%M:%S'))).ljust(setor.destino.colunas) + '\n'
                if pedido.cliente:
                    saida += 'Cliente: ' + str(pedido.cliente) + '\n'
                saida += '-'* setor.destino.colunas + '\n'
                saida += "Quant Descricao                      Cod    \n"
                saida += '-' * setor.destino.colunas + '\n'
                for item in alista:
                    saida += str(int(item.quantidade)).zfill(2).ljust(5) + ' ' + item.produto.descricao_impressao.ljust(30) + ' ' + str(item.produto.codigo).replace('.', ',').ljust(5) + '\n'
                    
                    if item.observacao != None and item.observacao != "":
                        saida += 'Obs.: ' + item.observacao + '\n\n'
                
                impressao.views.imprime_caixa(saida, setor.destino, setor.nome_setor, '')

    if pedido.mesa.tipo == 2:
        return HttpResponseRedirect('/pedido/' + str(mesa_id) + '/')
    return HttpResponseRedirect('/')

@login_required
@permission_required('restaurante.excluir_item')
def item_excluir(request, mesa_id, item_id):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
        
    item = Item.objects.get(id=item_id)
    
    if item.estado != 0:
        if item.estado == 2:
            if not request.user.has_perm("restaurante.excluir_item_confirmado"):
                request.session['aviso'] = 'Você não tem permissão para excluir este item'
                return HttpResponseRedirect('/pedido/' + mesa_id)
            
        item.estado = 0
        item.produto.quantidade += item.quantidade
        item.produto.quantidade_vendida -= int(item.quantidade)
        item.produto.categoria.quantidade_vendida -= int(item.quantidade)
        item.produto.categoria.save()
        item.produto.save()
        item.pedido.total = float(item.pedido.total) - (float(item.produto.preco_de_venda) * float(item.quantidade) )
        item.pedido.save()
        item.save()
        
        Evento(usuario = request.user, pedido = item.pedido, descricao = "Removeu Item %d - %dx %s" % (item.id, item.quantidade, item)).save()
    
    return HttpResponseRedirect('/pedido/' + mesa_id)

@login_required
@permission_required('restaurante.excluir_pagamento')
def pagamento_excluir(request, mesa_id, pagamento_id):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
        
    pagamento = Pagamento_parcial.objects.get(id = pagamento_id)
    
    if pagamento.estado != 0:
        pagamento.estado = 0
        pagamento.save()
        
        tipo = int(pagamento.tipo)
        valor = float(pagamento.valor)
        
        dia = Dia_funcionamento.objects.filter(fechado=None)[0]
        if tipo == 0:
            dia.dinheiro = float(dia.dinheiro) - float(valor)
        elif tipo == 1:
            dia.debito = float(dia.debito) - float(valor)
        elif tipo == 2:
            dia.cartao = float(dia.cartao) - float(valor)
        elif tipo == 3:
            dia.cheque = float(dia.cheque) - float(valor)
        elif tipo == 4:
            dia.crediario = float(dia.crediario) - float(valor)
        
        dia.save()
        
        Evento(usuario = request.user, pedido = pagamento.pedido, descricao = "Removeu Pagamento %d - %dx %s" % (pagamento.id, pagamento.valor, pagamento)).save()
    
    return HttpResponseRedirect('/pedido/' + mesa_id)

@login_required
@permission_required('restaurante.imprimir_parcial')
def pedido_parcial(request, mesa_id):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
        
    pedido = Pedido.objects.get(mesa_id=mesa_id, fechado = None)
    itens = Item.objects.filter(pedido_id = pedido.id)
    
    Evento(usuario = request.user, pedido = pedido, descricao = 'Imprimiu Parcial').save()
    
    nome = str(request.user)
    if request.user.first_name:
        nome = request.user.first_name
    
    # permanencia
    if pedido.fechado != None:
        pedido.permanencia = pedido.fechado - pedido.aberto
    else:
        pedido.permanencia = datetime.now() - pedido.aberto
    pedido.permanencia = str(pedido.permanencia).split()[-1].split(':')
    
    permanencia = ""
    
    if float(pedido.permanencia[0]) > 0:
        permanencia += pedido.permanencia[0]
        
        if float(pedido.permanencia[0]) > 1:
            permanencia += ' horas '
        else:
            permanencia += ' hora '
    
    if float(pedido.permanencia[1]) > 0:
        if float(pedido.permanencia[0]) > 0:
            permanencia += 'e '
        permanencia += pedido.permanencia[1]
        
        if float(pedido.permanencia[1]) > 1:
            permanencia += ' minutos'
        else:
            permanencia += ' minuto'
    
    if permanencia == '':
        permanencia = 'Poucos segundos'
    
    pedido.permanencia = permanencia
    # fim permanencia
    
    saida = datetime.now().strftime('%d/%m/%Y - %H:%M:%S') + ' - ' + unicode(nome) + '\n'
    saida += (str(pedido) + ' ' + unicode(pedido.mesa) + '. Entrada: '+ str(pedido.aberto.strftime('%H:%M:%S'))).ljust(pedido.mesa.setor.destino.colunas) + '\n'
    if pedido.cliente:
        saida += 'Cliente: ' + str(pedido.cliente) + '\n'
    
    saida += 'Permanencia: ' + pedido.permanencia + '\n'
    
    saida += '-'* pedido.mesa.setor.destino.colunas + '\n'
    saida +=  "    Descricao".ljust(pedido.mesa.setor.destino.colunas - 16) + " Qt  Unit  Total\n"
    saida += '-' * pedido.mesa.setor.destino.colunas + '\n'

    i = 0
    for item in itens:
        i += 1
        if item.estado != 0:
            if item.estado == 3:
                saida += str(i).zfill(3).rjust(3) + ' ' + item.produto.descricao_impressao.ljust(pedido.mesa.setor.destino.colunas - 21) + ' ' + "---".zfill(3).ljust(3) + ' ' + "----".rjust(5) +' ' + "----".rjust(6) + '\n'
            else:
                # coloquei int na quantidade para esconder o problema de quebrar linha por ser valor decimal
                saida += str(i).zfill(3).rjust(3) + ' ' + item.produto.descricao_impressao.ljust(pedido.mesa.setor.destino.colunas - 21) + ' ' + str(int(item.quantidade)).zfill(3).ljust(3) + ' ' + ("%.2f" % item.produto.preco_de_venda).replace('.', ',').rjust(5) +' ' + ("%.2f" % (item.quantidade * item.produto.preco_de_venda) ).replace('.', ',').rjust(6) + '\n'
    
    saida += '-' * pedido.mesa.setor.destino.colunas + '\n'
    
#    saida += ("TOTAL R$ " + str(pedido.total)).rjust(pedido.mesa.setor.destino.colunas)
    
    saida += ("Sub Total R$ ").rjust(pedido.mesa.setor.destino.colunas - 10) + ("%.2f" % pedido.total).replace('.', ',').rjust(10) + '\n'
    
    # porcentagem
    if float(pedido.mesa.porcentagem) > 0 and pedido.taxa_servico:
        porcentagem = float(pedido.total) * float(pedido.mesa.porcentagem) / 100
    else:
        porcentagem = 0.0
    # fim porcentagem
    
    # porcentagem
    if porcentagem > 0:
        if not saida.endswith('\n'):
            saida += '\n'
        saida += ('Taxa de servico RS '.rjust(pedido.mesa.setor.destino.colunas - 10)) + ('%.2f' % porcentagem).rjust(10) + '\n'
        
    if pedido.desconto != '0':
        saida += ('Desconto RS '.rjust(pedido.mesa.setor.destino.colunas - 10)) + ('%.2f' % float(pedido.desconto)).rjust(10) + '\n'
    
    saida += '-' * pedido.mesa.setor.destino.colunas + '\n'
    saida += ('TOTAL RS '.rjust(pedido.mesa.setor.destino.colunas - 10)) + ('%.2f' % (float(pedido.total) - float(pedido.desconto) + float(porcentagem))).replace('.', ',').rjust(10) + '\n' 
     
    
    #calculando valor pago
    pagamento_parcial = Pagamento_parcial.objects.filter(pedido_id = pedido.id, estado = 1)
    valor_pago = 0.0
    for pagamento in pagamento_parcial:
        valor_pago += float(pagamento.valor)
    
    if float(valor_pago) > 0:
        desc_tipo = {
            0 : 'dinheiro',
            1 : 'debito',
            2 : 'cartao',
            3 : 'cheque',
            4 : 'crediario'
        }
        
        saida += '-' * pedido.mesa.setor.destino.colunas + '\n'
        for pagamento in pagamento_parcial:
            saida += (('Pagamento ' + desc_tipo[pagamento.tipo] + ' RS ').rjust(pedido.mesa.setor.destino.colunas - 10)) + ('%.2f' % pagamento.valor).replace('.', ',').rjust(10) + '\n'
            
        
        saida += '\n' + ('Valor pago RS '.rjust(pedido.mesa.setor.destino.colunas - 10)) + ('%.2f' % valor_pago).replace('.', ',').rjust(10) + '\n'
        
        
        pedido.total = float(pedido.total) - valor_pago
    
    if pedido.desconto != '0':
        pedido.desconto = float('%.2f' % float(pedido.desconto))
        total = float('%.2f' % (float(pedido.total) - float(pedido.desconto)))
        
        if not saida.endswith('\n'):
            saida += '\n'
    else:
        total = float('%.2f' % float(pedido.total))
        
    if float(valor_pago) > 0: #porcentagem > 0 or pedido.desconto != '0' or valor_pago > 0:
        saida += '-' * pedido.mesa.setor.destino.colunas + '\n'
        
        if (total + porcentagem) > 0:
            saida += ('VALOR PENDENTE R$ ').rjust(pedido.mesa.setor.destino.colunas - 10) + ('%.2f' % (total + porcentagem)).replace('.', ',').rjust(10)
        else:
            saida += ('CONTA PAGA').rjust(pedido.mesa.setor.destino.colunas)
    
    
    impressao.views.imprime_caixa(saida, pedido.mesa.setor.destino)
    
    return HttpResponseRedirect('/pedido/?id=' + str(pedido.id))

@login_required
@permission_required('restaurante.imprimir_parcial')
def pedido_parcial_agrupado(request, mesa_id):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
        
    pedido = Pedido.objects.get(mesa_id=mesa_id, fechado = None)
    dia = pedido.dia
    # Produtos
    total_produtos = {}
    quantidade_produtos = {}
    
    total_produtos_categoria = {}
    quantidade_produtos_categoria = {}
    
    categorias = Categoria.objects.all()
    for categoria in categorias:
        categoria.itens = Item.objects.filter(pedido = pedido, produto__categoria = categoria, pedido__dia = dia, estado = 2)
        categoria.produtos = Produto.objects.filter(categoria = categoria)
        
        for produto in categoria.produtos:
            total_produtos[produto.id] = 0.0
            quantidade_produtos[produto.id] = 0
        
        categoria.total_produtos_categoria = 0.0
        categoria.quantidade_produtos_categoria = 0
        
        for item in categoria.itens:
            total_produtos[item.produto.id] = float(total_produtos[item.produto.id]) + int(item.quantidade) * float(item.produto.preco_de_venda)
            quantidade_produtos[item.produto.id] += int(item.quantidade)
    
        for produto in categoria.produtos:
            produto.total_produtos = total_produtos[produto.id]
            produto.quantidade_produtos = quantidade_produtos[produto.id]
            
            categoria.total_produtos_categoria += total_produtos[produto.id]
            categoria.quantidade_produtos_categoria += quantidade_produtos[produto.id]
    
    saida2 = ""
    i = 0
    for categoria in categorias:
        
        if categoria.quantidade_produtos_categoria > 0:
            #saida2 += '-' * dia.setor.destino.colunas + '\n'
            #saida2 += ("\nCategoria %s - %d - R$ %.2f" % (str(categoria), categoria.quantidade_produtos_categoria, categoria.total_produtos_categoria)).replace('.', ',') + '\n'
            
            for produto in categoria.produtos:
                
                if produto.quantidade_produtos > 0:
                    i += 1
                    # saida2 += ("%s %.4d     %10.2f" % (str(produto).ljust(30), produto.quantidade_produtos, produto.total_produtos)).replace('.', ',') + '\n'
                    saida2 += str(i).zfill(3).rjust(3) + ' ' + produto.descricao_impressao.ljust(pedido.mesa.setor.destino.colunas - 21) + ' ' + str(int(produto.quantidade_produtos)).zfill(3).ljust(3) + ' ' + ("%.2f" % produto.preco_de_venda).replace('.', ',').rjust(5) +' ' + ("%.2f" % (produto.total_produtos) ).replace('.', ',').rjust(6) + '\n'
    
    Evento(usuario = request.user, pedido = pedido, descricao = 'Imprimiu Parcial').save()
    
    nome = str(request.user)
    if request.user.first_name:
        nome = request.user.first_name
    
    # permanencia
    if pedido.fechado != None:
        pedido.permanencia = pedido.fechado - pedido.aberto
    else:
        pedido.permanencia = datetime.now() - pedido.aberto
    pedido.permanencia = str(pedido.permanencia).split()[-1].split(':')
    
    permanencia = ""
    
    if float(pedido.permanencia[0]) > 0:
        permanencia += pedido.permanencia[0]
        
        if float(pedido.permanencia[0]) > 1:
            permanencia += ' horas '
        else:
            permanencia += ' hora '
    
    if float(pedido.permanencia[1]) > 0:
        if float(pedido.permanencia[0]) > 0:
            permanencia += 'e '
        permanencia += pedido.permanencia[1]
        
        if float(pedido.permanencia[1]) > 1:
            permanencia += ' minutos'
        else:
            permanencia += ' minuto'
    
    if permanencia == '':
        permanencia = 'Poucos segundos'
    
    pedido.permanencia = permanencia
    # fim permanencia
    
    saida = datetime.now().strftime('%d/%m/%Y - %H:%M:%S') + ' - ' + unicode(nome) + '\n'
    saida += (str(pedido) + ' ' + unicode(pedido.mesa) + '. Entrada: '+ str(pedido.aberto.strftime('%H:%M:%S'))).ljust(pedido.mesa.setor.destino.colunas) + '\n'
    if pedido.cliente:
        saida += 'Cliente: ' + str(pedido.cliente) + '\n'
    
    saida += 'Permanencia: ' + pedido.permanencia + '\n'
    
    saida += '-'* pedido.mesa.setor.destino.colunas + '\n'
    saida +=  "    Descricao".ljust(pedido.mesa.setor.destino.colunas - 16) + " Qt  Unit  Total\n"
    saida += '-' * pedido.mesa.setor.destino.colunas + '\n'
    
    '''
    i = 0
    for item in itens:
        i += 1
        if item.estado != 0:
            if item.estado == 3:
                saida += str(i).zfill(3).rjust(3) + ' ' + item.produto.descricao_impressao.ljust(30) + ' ' + "--".zfill(2).ljust(2) + ' ' + "----".ljust(5) +' ' + "----".rjust(6) + '\n'
            else:
                # coloquei int na quantidade para esconder o problema de quebrar linha por ser valor decimal
                saida += str(i).zfill(3).rjust(3) + ' ' + item.produto.descricao_impressao.ljust(30) + ' ' + str(int(item.quantidade)).zfill(2).ljust(2) + ' ' + ("%.2f" % item.produto.preco_de_venda).replace('.', ',').ljust(5) +' ' + ("%.2f" % (item.quantidade * item.produto.preco_de_venda) ).replace('.', ',').rjust(6) + '\n'
    '''
    saida += saida2
    saida += '-' * pedido.mesa.setor.destino.colunas + '\n'
    
#    saida += ("TOTAL R$ " + str(pedido.total)).rjust(pedido.mesa.setor.destino.colunas)
    
    saida += ("Sub Total R$ ").rjust(pedido.mesa.setor.destino.colunas - 10) + ("%.2f" % pedido.total).replace('.', ',').rjust(10) + '\n'
    
    # porcentagem
    if float(pedido.mesa.porcentagem) > 0 and pedido.taxa_servico:
        porcentagem = float(pedido.total) * float(pedido.mesa.porcentagem) / 100
    else:
        porcentagem = 0.0
    # fim porcentagem
    
    # porcentagem
    if porcentagem > 0:
        if not saida.endswith('\n'):
            saida += '\n'
        saida += ('Taxa de servico RS '.rjust(pedido.mesa.setor.destino.colunas - 10)) + ('%.2f' % porcentagem).rjust(10) + '\n'
        
    if pedido.desconto != '0':
        saida += ('Desconto RS '.rjust(pedido.mesa.setor.destino.colunas - 10)) + ('%.2f' % float(pedido.desconto)).rjust(10) + '\n'
    
    saida += '-' * pedido.mesa.setor.destino.colunas + '\n'
    saida += ('TOTAL RS '.rjust(pedido.mesa.setor.destino.colunas - 10)) + ('%.2f' % (float(pedido.total) - float(pedido.desconto) + float(porcentagem))).replace('.', ',').rjust(10) + '\n' 
     
    
    #calculando valor pago
    pagamento_parcial = Pagamento_parcial.objects.filter(pedido_id = pedido.id, estado = 1)
    valor_pago = 0.0
    for pagamento in pagamento_parcial:
        valor_pago += float(pagamento.valor)
    
    if float(valor_pago) > 0:
        desc_tipo = {
            0 : 'dinheiro',
            1 : 'debito',
            2 : 'cartao',
            3 : 'cheque',
            4 : 'crediario'
        }
        
        saida += '-' * pedido.mesa.setor.destino.colunas + '\n'
        for pagamento in pagamento_parcial:
            saida += (('Pagamento ' + desc_tipo[pagamento.tipo] + ' RS ').rjust(40)) + ('%.2f' % pagamento.valor).replace('.', ',').rjust(10) + '\n'
            
        
        saida += '\n' + ('Valor pago RS '.rjust(pedido.mesa.setor.destino.colunas - 10)) + ('%.2f' % valor_pago).replace('.', ',').rjust(10) + '\n'
        
        
        pedido.total = float(pedido.total) - valor_pago
    
    if pedido.desconto != '0':
        pedido.desconto = float('%.2f' % float(pedido.desconto))
        total = float('%.2f' % (float(pedido.total) - float(pedido.desconto)))
        
        if not saida.endswith('\n'):
            saida += '\n'
    else:
        total = float('%.2f' % float(pedido.total))
        
    if float(valor_pago) > 0: #porcentagem > 0 or pedido.desconto != '0' or valor_pago > 0:
        saida += '-' * pedido.mesa.setor.destino.colunas + '\n'
        
        if (total + porcentagem) > 0:
            saida += ('VALOR PENDENTE R$ ').rjust(pedido.mesa.setor.destino.colunas - 10) + ('%.2f' % (total + porcentagem)).replace('.', ',').rjust(10)
        else:
            saida += ('CONTA PAGA').rjust(pedido.mesa.setor.destino.colunas)
    
    
    impressao.views.imprime_caixa(saida, pedido.mesa.setor.destino)
    
    return HttpResponseRedirect('/pedido/?id=' + str(pedido.id)) 

@login_required
@csrf_exempt
@permission_required('restaurante.adicionar_pagamento')
def pagamento_parcial(request):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
        
    pedido_id = request.POST["pedido_id"]
    valor = request.POST["valor"].replace(',','.')
    tipo = int(request.POST['tipo'])
    
    if Pedido.objects.filter(id = pedido_id, fechado = None).count() > 0:
        pedido = Pedido.objects.get(id=pedido_id)
        try:
            valor = float(valor)
            
            if valor <= 0:
                request.session["aviso"] = "Pagamento deve ser maior que Zero"
                return HttpResponseRedirect("/pedido/"+ str(pedido.mesa_id))
            if pedido.desconto == '':
                pedido.desconto = 0.0
                
            if pedido.taxa_servico:
                taxa = (float(pedido.mesa.porcentagem) / 100) * float(pedido.total)
            else:
                taxa = 0.0
            
            pagamento_parcial = Pagamento_parcial.objects.filter(pedido_id = pedido.id, estado = 1)
            valor_pago = 0.0
            for pagamento in pagamento_parcial:
                valor_pago += float(pagamento.valor)
                
            if round(valor, 2) > round((float(pedido.total) + float(taxa) - float(pedido.desconto) - valor_pago), 2):
                request.session["aviso"] = "Pagamento maior que o total"
                return HttpResponseRedirect("/pedido/"+ str(pedido.mesa_id))
            
            pagamento = Pagamento_parcial(pedido=pedido, valor=valor, data=datetime.now(), tipo = tipo)
            pagamento.save()
            Evento(usuario = request.user, pedido = pedido, descricao = 'Pagamento parcial').save()
            
            dia = Dia_funcionamento.objects.filter(fechado=None)[0]
            if tipo == 0:
                dia.dinheiro = float(dia.dinheiro) + float(valor)
            elif tipo == 1:
                dia.debito = float(dia.debito) + float(valor)
            elif tipo == 2:
                dia.cartao = float(dia.cartao) + float(valor)
            elif tipo == 3:
                dia.cheque = float(dia.cheque) + float(valor)
            elif tipo == 4:
                dia.crediario = float(dia.crediario) + float(valor)
            
            dia.save()
            
        except:
            if request.POST["valor"].strip() == '':
                
                '''
                Pagamento completo e em dinheiro, caso seja adicionado pagamento vazio
                '''
                if pedido.desconto == '':
                    pedido.desconto = 0.0
                    
                if pedido.taxa_servico:
                    taxa = (float(pedido.mesa.porcentagem) / 100) * float(pedido.total)
                else:
                    taxa = 0.0
                
                pagamento_parcial = Pagamento_parcial.objects.filter(pedido_id = pedido.id, estado = 1)
                valor_pago = 0.0
                for pagamento in pagamento_parcial:
                    valor_pago += float(pagamento.valor)
                    
                valor = round((float(pedido.total) + float(taxa) - float(pedido.desconto) - valor_pago), 2)
                
                pagamento = Pagamento_parcial(pedido=pedido, valor=valor, data=datetime.now(), tipo = tipo)
                pagamento.save()
                Evento(usuario = request.user, pedido = pedido, descricao = 'Pagamento parcial').save()
                
                dia = Dia_funcionamento.objects.filter(fechado=None)[0]
                if tipo == 0:
                    dia.dinheiro = float(dia.dinheiro) + float(valor)
                    desc_tipo = 'dinheiro'
                elif tipo == 1:
                    dia.debito = float(dia.debito) + float(valor)
                    desc_tipo = 'debito'
                elif tipo == 2:
                    dia.cartao = float(dia.cartao) + float(valor)
                    desc_tipo = 'cartao'
                elif tipo == 3:
                    dia.cheque = float(dia.cheque) + float(valor)
                    desc_tipo = 'cheque'
                elif tipo == 4:
                    dia.crediario = float(dia.crediario) + float(valor)
                    desc_tipo = 'crediario'
                
                dia.save()
                '''
                Fim Pagamento completo
                '''
                
                request.session['mensagem'] = 'Adicionado pagamento completo em ' + desc_tipo
            else:
                request.session["aviso"] = "Valor inválido"
        return HttpResponseRedirect("/pedido/" + str(pedido.mesa_id))
    request.session["aviso"] = "Pedido inválido"
    return HttpResponseRedirect("/")

@login_required
def pedido_item_observacao(request):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
    
    if request.is_ajax():
        
        if request.POST.has_key('item_id') and request.POST.has_key('observacao'):
    
            item_id = int(request.POST['item_id'])
            observacao = request.POST['observacao']
            
            if Item.objects.filter(id = item_id).count() > 0:
                item = Item.objects.get(id = item_id)
                item.observacao = observacao
                item.save()
    
#    format = 'json'
#    mimetype = 'application/javascript'
#    
#    data = serializers.serialize(format, item)
#    return HttpResponse(data, mimetype)
    return HttpResponse(None)

@csrf_exempt
@login_required
@permission_required('restaurante.alterar_mesa')
def pedido_alterar_mesa(request, pedido_id):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
        
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
        
    if Pedido.objects.filter(id = pedido_id).count() > 0:
        pedido = Pedido.objects.get(id = pedido_id)
        
        pedidos_abertos = Pedido.objects.filter(fechado = None)
        mesas = list(Mesa.objects.all())
        
        '''
        for p in pedidos_abertos:
            if pedido.mesa != p.mesa:
                mesas.remove(p.mesa)
        '''
        
        if request.POST.has_key('validar'):
            if int(request.POST['validar']) == 1:
                try:
                    mesa_id = int(request.POST['mesa_id'])
                    if Mesa.objects.filter(id = mesa_id).count() > 0:
                        mesa = Mesa.objects.get(id = mesa_id)
                        if pedido.mesa_id != mesa_id and Pedido.objects.filter(mesa_id = mesa.id, fechado = None).count() > 0:
                            from pickle import dumps
                            mesas_selecionadas = dumps([pedido.mesa_id, mesa.id])
                            return render_to_response('restaurante/pedido_alterar_mesa_unir.html', locals(),
                                context_instance=RequestContext(request))
                        else:
                            Evento(usuario = request.user, pedido = pedido, descricao = "Mudou de %s para %s" % (pedido.mesa, mesa)).save()
                            pedido.mesa = mesa
                            pedido.save()
                            return HttpResponseRedirect('/pedido/?id=' + str(pedido.id))
                    else:
                        request.session['aviso'] = u'Mesa \"' + request.POST['mesa_id'] + u'\" não existe'
                        return HttpResponseRedirect('/pedido/?id=' + str(pedido.id))
                except:
                    request.session['aviso'] = u'Mesa \"' + request.POST['mesa_id'] + u'\" não existe'
                    return HttpResponseRedirect('/pedido/?id=' + str(pedido.id))
        
        return render_to_response('restaurante/pedido_alterar_mesa.html', locals(),
            context_instance=RequestContext(request))
    else:
        request.session['aviso'] = 'Pedido não existe'
        
    return HttpResponseRedirect('/pedido/' + str(pedido.mesa_id))

@login_required
@permission_required('restaurante.fechar_pedido')
def pedido_fechar(request, mesa_id):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
        
    if Pedido.objects.filter(mesa_id = mesa_id, fechado = None).count() > 0:
        pedido = Pedido.objects.get(mesa_id = mesa_id, fechado = None)
        
        pagamentos = Pagamento_parcial.objects.filter(pedido = pedido, estado = 1)
        total_pago = 0.0
        for pagamento in pagamentos:
            total_pago = float(total_pago) + float(pagamento.valor)
        
        if pedido.taxa_servico:
            taxa = (float(pedido.mesa.porcentagem) / 100) * float(pedido.total)
        else:
            taxa = 0.0
        
        # se mesa tipo ENTREGA
        if pedido.mesa.tipo == 2:
            try:
                valor = float(request.POST["valor"].replace(',','.'))
                
                if valor <= 0:
                    request.session["aviso"] = "Pagamento deve ser maior que Zero"
                    return HttpResponseRedirect("/pedido/"+ str(pedido.mesa_id))

                if pedido.desconto == '0':
                    pedido.desconto = 0.0
                    
                if valor < (float(pedido.total) - float(pedido.desconto)):
                    request.session["aviso"] = "Pagamento menor que o total"
                    return HttpResponseRedirect("/pedido/"+ str(pedido.mesa_id))
                
                troco = valor - (float(pedido.total) - float(pedido.desconto))
                Evento(usuario = request.user, pedido = pedido, descricao = 'Pagamento').save()

                pedido.fechado = datetime.now()
                pedido.save()
                
                dia = Dia_funcionamento.objects.get(fechado = None)
                dia.dinheiro = float(dia.dinheiro) + float(float(pedido.total) - float(pedido.desconto))
                dia.save()
            
                Evento(usuario = request.user, pedido = pedido, descricao = 'Fechou pedido').save()
            
                enderecos = Endereco.objects.filter(cliente_id = pedido.cliente_id)
                return render_to_response('restaurante/pedido_entrega_confirmar_endereco.html', locals(),
                    context_instance=RequestContext(request))

            except:
                request.session["aviso"] = "Valor inválido"
            return HttpResponseRedirect("/pedido/" + str(pedido.mesa_id))
        
        total = float(pedido.total) + float(taxa) - float(pedido.desconto) - float(total_pago)
        if round(total, 2) > 0.0:
            request.session['aviso'] = "Efetue o pagamento total deste pedido"
            return HttpResponseRedirect("/pedido/"+ str(pedido.mesa_id))

        
        
        itens = Item.objects.filter(pedido = pedido, estado = 1)
        for item in itens:
            item.estado = 2
            item.save()
        
        pedido.fechado = datetime.now()
        pedido.save()
        Evento(usuario = request.user, pedido = pedido, descricao = 'Fechou Pedido').save()

    return HttpResponseRedirect('/')

@login_required
def preparar_metade(request, pedido_id):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
        
    dia = Dia_funcionamento.objects.get(fechado=None)
    if Pedido.objects.filter(id = pedido_id ).count() > 0:
        pedido = Pedido.objects.get(id = pedido_id)
        itens = Item.objects.filter(pedido = pedido, estado = 1)

        if itens.count() > 1:
            quantidade = itens.count()
            
            sabores = datetime.now().strftime('%d/%m/%Y - %H:%M:%S') + '\n'
            sabores += (str(pedido) + ' ' + str(pedido.mesa) + '. Entrada: '+ str(pedido.aberto.strftime('%H:%M:%S'))).ljust(itens[0].produto.setor.destino.colunas) + '\n\n'
            
            sabores += str(quantidade) + " Sabores\n\n"
            

            maior_item = itens[0]
            #sabores += "1/" + str(quantidade) + " " + str(maior_item.produto.descricao_impressao) + "\n"
            for item in itens:
                if (float(maior_item.produto.preco_de_venda) < float(item.produto.preco_de_venda)) :
                    maior_item = item
                
                sabores += "1/" + str(quantidade) + " " + str(item.produto.descricao_impressao) + "\n"
                
                if item.observacao != None and item.observacao != "":
                    sabores += 'Obs.: ' + item.observacao + '\n\n'
                
                pedido.total = float(pedido.total) - float(item.produto.preco_de_venda)
                pedido.save()
                
                item.estado = 3
                item.produto.quantidade_vendida -= int(item.quantidade)
                item.produto.categoria.quantidade_vendida -= int(item.quantidade)
                item.produto.categoria.save()
                item.save()
                # gravar_evento(request.user, u"Parte menor valor removida. %s - %dx %s" % (item.produto.codigo, item.quantidade, item), pedido)

            pedido.total = float(pedido.total) + float(maior_item.produto.preco_de_venda)
            pedido.save()
            
            maior_item.produto.quantidade_vendida += int(maior_item.quantidade)
            maior_item.produto.categoria.quantidade_vendida += int(maior_item.quantidade)
            maior_item.produto.categoria.save()
            maior_item.estado=2
            maior_item.save()
            Evento(usuario = request.user, pedido = pedido, descricao = u"Parte MAIOR VALOR PROCESSADA para metade. Cód. %s - %dx %s" % (item.produto.codigo, item.quantidade, item)).save()

            impressao.views.imprime_caixa(sabores, maior_item.produto.setor.destino, maior_item.produto.setor.nome_setor, '')
        else:
            pass

    else:
        request.session["aviso"] = "O pedido não existe"

    return HttpResponseRedirect("/pedido/" + str(pedido.mesa_id) )

@login_required
def entregas(request):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
        
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
        
    if Dia_funcionamento.objects.filter(fechado = None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))

    lista_mesas = Mesa.objects.filter(tipo = 2)
    pedidos = Pedido.objects.filter(fechado = None)
    
    for mesa in lista_mesas:
        pedido = pedidos.filter(mesa=mesa.id)
        if len(pedido) != 0:
            mesa.pedido = pedido[0]
            mesa.itens = Item.objects.filter(pedido_id=mesa.pedido.id, estado = 1).count()
    
    header = 'Entregas'
    css = 'restaurante/mesas'
    js = 'restaurante/mesas'
    return render_to_response('restaurante/mesa.html',locals(),
        context_instance=RequestContext(request))

@login_required
def balcao(request):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
        
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
        
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))

    lista_mesas = Mesa.objects.filter(tipo = 3)
    pedidos = Pedido.objects.filter(fechado = None)
    
    for mesa in lista_mesas:
        pedido = pedidos.filter(mesa=mesa.id)
        if len(pedido) != 0:
            mesa.pedido = pedido[0]
            mesa.itens = Item.objects.filter(pedido_id=mesa.pedido.id, estado = 1).count()
    
    header = 'Balcão'
    css = 'restaurante/mesas'
    js = 'restaurante/mesas'
    return render_to_response('restaurante/mesa.html',locals(),
        context_instance=RequestContext(request))

@login_required
@csrf_exempt
@permission_required('relatorio.view_report')
def relatorio(request):
    if Dia_funcionamento.objects.all().count() == 0:
        request.session['aviso'] = "Nenhuma data encontrada"
        return HttpResponseRedirect('/')
    
    #
    #
    
    # buscar datas iniciais e finais
    inicio = Dia_funcionamento.objects.get(id=1).aberto
    fim = datetime.now()
    
    hoje = datetime.today()
    
    anos = range(inicio.year, fim.year + 1)
    anos.reverse()
    
    meses = {
        1: 'Janeiro',
        2: 'Fevereiro',
        3: 'Março',
        4: 'Abril',
        5: 'Maio',
        6: 'Junho',
        7: 'Julho',
        8: 'Agosto',
        9: 'Setembro',
        10: 'Outubro',
        11: 'Novembro',
        12: 'Dezembro'
    }
    
    days = range(1, 32)
    
    if request.POST.has_key('busca') and request.POST['busca'] == '1':
        dia = request.POST['dia']
        mes = request.POST['mes']
        ano = request.POST['ano']
        
        data = date(int(ano), int(mes), int(dia))
        
        if request.POST['evento'].strip() != '':
            evento = request.POST['evento'].strip()
            dias = Dia_funcionamento.objects.filter(Q(evento__icontains=evento)|(Q(aberto__gt=data)&Q(aberto__lte=data+timedelta(1)))).order_by('-id')
        else:
            dias = Dia_funcionamento.objects.filter(Q(aberto__gt=data)&Q(aberto__lte=data+timedelta(1))).order_by('-id')
    else:
        dias = Dia_funcionamento.objects.all().order_by('-id')
    
    return render_to_response('restaurante/relatorio.html',locals(),
        context_instance=RequestContext(request))

@login_required
@permission_required('relatorio.view_report')
def relatorio_dia(request, dia_id):
    dia = Dia_funcionamento.objects.get(id=dia_id)
    
    total = 0.0
    desconto = 0.0
    valor_final = 0.0
    numero_pessoas = 0
    
    if dia.fechado == None:
        dia.fechado = datetime.now()
        pedidos_abertos = Pedido.objects.filter(aberto__gte = dia.aberto, fechado=None)
        
        for pedido in pedidos_abertos:
            pedido.valor_final = float(pedido.total)
            if pedido.desconto != '':
                pedido.valor_final -= float(pedido.desconto)
            else:
                pedido.desconto = 0
            
            total += float(pedido.total)
            desconto += float(pedido.desconto)
            valor_final += float(pedido.valor_final)
            numero_pessoas += pedido.numero_pessoas
            
            pedido.desconto = ("%.2f" % float(pedido.desconto)).replace('.', ',')
            pedido.valor_final = ("%.2f" % pedido.valor_final).replace('.', ',')
    
    pedidos_fechados = Pedido.objects.filter(aberto__gte = dia.aberto, fechado__lt=dia.fechado)
    for pedido in pedidos_fechados:
        pedido.valor_final = float(pedido.total)
        if pedido.desconto != '':
            pedido.valor_final -= float(pedido.desconto)
        else:
            pedido.desconto = 0
        
        total += float(pedido.total)
        desconto += float(pedido.desconto)
        valor_final += float(pedido.valor_final)
        numero_pessoas += pedido.numero_pessoas
            
        pedido.desconto = ("%.2f" % float(pedido.desconto)).replace('.', ',')
        pedido.valor_final = ("%.2f" % pedido.valor_final).replace('.', ',')
    
    total = ("%.2f" % total).replace('.', ',')
    desconto = ("%.2f" % desconto).replace('.', ',')
    valor_final = ("%.2f" % valor_final).replace('.', ',')
    
    return render_to_response('restaurante/relatorio_pedido.html', locals(),
        context_instance=RequestContext(request))

@login_required
@permission_required('relatorio.view_report')
def relatorio_pedido(request, pedido_id):
    pedido = Pedido.objects.get(id = pedido_id)
    itens = Item.objects.filter(pedido_id = pedido_id)
    
    return render_to_response('restaurante/relatorio_pedido_item.html', locals(),
        context_instance=RequestContext(request))

@login_required
def pedido_desconto(request):
    
    if request.is_ajax() and request.user.has_perm('restaurante.dar_desconto'):
        
        if request.POST.has_key('pedido_id') and request.POST.has_key('desconto'):
    
            pedido_id = int(request.POST['pedido_id'])
            desconto = request.POST['desconto']
            
            if Pedido.objects.filter(id = pedido_id).count() > 0:
                pedido = Pedido.objects.get(id = pedido_id)
                pedido.desconto = desconto
                pedido.save()
                Evento(usuario = request.user, data = datetime.now(), pedido = pedido, descricao = u"Desconto " + desconto).save()
                
    
#    format = 'json'
#    mimetype = 'application/javascript'
#    
#    data = serializers.serialize(format, item)
#    return HttpResponse(data, mimetype)
    return HttpResponse(None)

@login_required
def alterar_taxa_servico(request):
    print request.user.has_perm('restaurante.alterar_taxa')
    if request.is_ajax() and request.user.has_perm('restaurante.alterar_taxa'):
        
        if request.POST.has_key('pedido_id') and request.POST.has_key('taxa_servico'):
    
            pedido_id = int(request.POST['pedido_id'])
            taxa_servico = request.POST['taxa_servico']
            
            if taxa_servico == "true":
                taxa_servico = True
            else:
                taxa_servico = False
            
            if Pedido.objects.filter(id = pedido_id).count() > 0:
                pedido = Pedido.objects.get(id = pedido_id)
                pedido.taxa_servico = taxa_servico
                pedido.save()
                
                if taxa_servico:
                    Evento(usuario = request.user, data = datetime.now(), pedido = pedido, descricao = u"Incluída a taxa de serviço").save()
                else:
                    Evento(usuario = request.user, data = datetime.now(), pedido = pedido, descricao = u"Removida a taxa de serviço").save()
    else:
        print 'aqui'
    
#    format = 'json'
#    mimetype = 'application/javascript'
#    
#    data = serializers.serialize(format, item)
#    return HttpResponse(data, mimetype)
    return HttpResponse(None)

@login_required
@permission_required("relatorio.view_report")
def pedido_fechado(request, pedido_id):
    return HttpResponseRedirect('/pedido/?id=' + pedido_id)

    if Pedido.objects.filter(id = pedido_id).count() == 1:
        pedido = Pedido.objects.get(id = pedido_id)
        
        if pedido.fechado != None:
            lista_itens = Item.objects.filter(pedido_id=pedido.id)
            itens = Item.objects.filter(pedido_id=pedido.id, estado__gt = 0).count()
            
            lista_abertos = Item.objects.filter(pedido_id = pedido.id, estado = 1)
            abertos = lista_abertos.count()
            
            
            for item in lista_itens:
                item.valor_total = item.quantidade * item.produto.preco_de_venda
            
            total = float(pedido.total)
            
            #Calculando desconto
            if pedido.desconto != '0':
                total = (float(pedido.total) - float(pedido.desconto))
                
            #calculando 
            pagamento_parcial = Pagamento_parcial.objects.filter(pedido_id = pedido.id)
            valor_pago = 0.0
            for pagamento in pagamento_parcial:
                if pagamento.estado == 1:
                    valor_pago += float(pagamento.valor)
            
            total -= valor_pago
            total = round(total, 3)
            
            if pedido.taxa_servico:
                taxa = float(pedido.total) * (float(pedido.mesa.porcentagem) / 100.)
                total = float(total) + float(taxa)
            
            if total < 0:
                total = float(total) + float(pedido.desconto)
                pedido.desconto = '0'
                pedido.taxa_servico = True
                if pedido.taxa_servico:
                    taxa = float(pedido.total) * (float(pedido.mesa.porcentagem) / 100.)
                    total = float(total) + float(taxa)
                pedido.save()
            
            mensagem = False
            aviso = False
            if request.session.has_key('mensagem'):
                mensagem = request.session['mensagem']
                del request.session['mensagem']
            if request.session.has_key('aviso'):
                aviso = request.session['aviso']
                del request.session['aviso']
            
            total = float(total)
            total = round(total, 2)
            pedido.total = float(pedido.total)
            
            js = 'restaurante/pedido'
            css = 'restaurante/pedido'
            return render_to_response('restaurante/pedido_fechado.html', locals(),
                context_instance=RequestContext(request))
        else:
            return HttpResponseRedirect('/pedido/' + str(pedido.mesa) + '/')
    else:
        request.session['aviso'] = 'Tentando acessar pedido não existente'
        return HttpResponseRedirect('/pedido/' + str(pedido.mesa) + '/')

@login_required
@permission_required('relatorio.view_report')
def pedido_fechado_parcial(request, pedido_id):
    pedido = Pedido.objects.get(id = pedido_id)
    itens = Item.objects.filter(pedido_id = pedido.id)
    
    Evento(usuario = request.user, pedido = pedido, descricao = 'Imprimiu Parcial').save()
    
    # permanencia
    if pedido.fechado != None:
        pedido.permanencia = pedido.fechado - pedido.aberto
    else:
        pedido.permanencia = datetime.now() - pedido.aberto
    pedido.permanencia = str(pedido.permanencia).split()[-1].split(':')
    
    permanencia = ""
    
    if float(pedido.permanencia[0]) > 0:
        permanencia += pedido.permanencia[0]
        
        if float(pedido.permanencia[0]) > 1:
            permanencia += ' horas '
        else:
            permanencia += ' hora '
    
    if float(pedido.permanencia[1]) > 0:
        if float(pedido.permanencia[0]) > 0:
            permanencia += 'e '
        permanencia += pedido.permanencia[1]
        
        if float(pedido.permanencia[1]) > 1:
            permanencia += ' minutos'
        else:
            permanencia += ' minuto'
    
    if permanencia == '':
        permanencia = 'Poucos segundos'
    
    pedido.permanencia = permanencia
    # fim permanencia
    
    nome = str(request.user)
    if request.user.first_name:
        nome = request.user.first_name
    
    saida = datetime.now().strftime('%d/%m/%Y - %H:%M:%S') + ' - ' + unicode(nome) + '\n'
    saida += (str(pedido) + ' ' + unicode(pedido.mesa) + '. Entrada: '+ str(pedido.aberto.strftime('%H:%M:%S'))).ljust(pedido.mesa.setor.destino.colunas) + '\n'
    if pedido.cliente:
        saida += 'Cliente: ' + str(pedido.cliente) + '\n'
    
    saida += 'Permanencia: ' + pedido.permanencia + '\n'
    
    saida += '-'* pedido.mesa.setor.destino.colunas + '\n'
    saida +=  "    Descricao".ljust(pedido.mesa.setor.destino.colunas - 16) + " Qt  Unit  Total\n"
    saida += '-' * pedido.mesa.setor.destino.colunas + '\n'

    i = 0
    for item in itens:
        i += 1
        if item.estado != 0:
            if item.estado == 3:
                saida += str(i).zfill(3).rjust(3) + ' ' + item.produto.descricao_impressao.ljust(pedido.mesa.setor.destino.colunas - 21) + ' ' + "---".zfill(3).ljust(3) + ' ' + "----".rjust(5) +' ' + "----".rjust(6) + '\n'
            else:
                # coloquei int na quantidade para esconder o problema de quebrar linha por ser valor decimal
                saida += str(i).zfill(3).rjust(3) + ' ' + item.produto.descricao_impressao.ljust(pedido.mesa.setor.destino.colunas - 21) + ' ' + str(int(item.quantidade)).zfill(3).ljust(3) + ' ' + ("%.2f" % item.produto.preco_de_venda).replace('.', ',').rjust(5) +' ' + ("%.2f" % (item.quantidade * item.produto.preco_de_venda) ).replace('.', ',').rjust(6) + '\n'
    
    saida += '-' * pedido.mesa.setor.destino.colunas + '\n'
    
#    saida += ("TOTAL R$ " + str(pedido.total)).rjust(pedido.mesa.setor.destino.colunas)
    
    saida += ("Sub Total R$ ").rjust(pedido.mesa.setor.destino.colunas - 10) + ("%.2f" % pedido.total).replace('.', ',').rjust(10) + '\n'
    
    # porcentagem
    if float(pedido.mesa.porcentagem) > 0 and pedido.taxa_servico:
        porcentagem = float(pedido.total) * float(pedido.mesa.porcentagem) / 100
    else:
        porcentagem = 0.0
    # fim porcentagem
    
    # porcentagem
    if porcentagem > 0:
        if not saida.endswith('\n'):
            saida += '\n'
        saida += ('Taxa de servico RS '.rjust(pedido.mesa.setor.destino.colunas - 10)) + ('%.2f' % porcentagem).rjust(10) + '\n'
        
    if pedido.desconto != '0':
        saida += ('Desconto RS '.rjust(pedido.mesa.setor.destino.colunas - 10)) + ('%.2f' % float(pedido.desconto)).rjust(10) + '\n'
    
    saida += '-' * pedido.mesa.setor.destino.colunas + '\n'
    saida += ('TOTAL RS '.rjust(pedido.mesa.setor.destino.colunas - 10)) + ('%.2f' % (float(pedido.total) - float(pedido.desconto) + float(porcentagem))).replace('.', ',').rjust(10) + '\n' 
     
    
    #calculando valor pago
    pagamento_parcial = Pagamento_parcial.objects.filter(pedido_id = pedido.id, estado = 1)
    valor_pago = 0.0
    for pagamento in pagamento_parcial:
        valor_pago += float(pagamento.valor)
    
    if float(valor_pago) > 0:
        desc_tipo = {
            0 : 'dinheiro',
            1 : 'debito',
            2 : 'cartao',
            3 : 'cheque',
            4 : 'crediario'
        }
        
        saida += '-' * pedido.mesa.setor.destino.colunas + '\n'
        for pagamento in pagamento_parcial:
            saida += (('Pagamento ' + desc_tipo[pagamento.tipo] + ' RS ').rjust(pedido.mesa.setor.destino.colunas - 10)) + ('%.2f' % pagamento.valor).replace('.', ',').rjust(10) + '\n'
            
        
        saida += '\n' + ('Valor pago RS '.rjust(pedido.mesa.setor.destino.colunas - 10)) + ('%.2f' % valor_pago).replace('.', ',').rjust(10) + '\n'
        
        
        pedido.total = float(pedido.total) - valor_pago
    
    if pedido.desconto != '0':
        pedido.desconto = float('%.2f' % float(pedido.desconto))
        total = float('%.2f' % (float(pedido.total) - float(pedido.desconto)))
        
        if not saida.endswith('\n'):
            saida += '\n'
    else:
        total = float('%.2f' % float(pedido.total))
        
    if float(valor_pago) > 0: #porcentagem > 0 or pedido.desconto != '0' or valor_pago > 0:
        saida += '-' * pedido.mesa.setor.destino.colunas + '\n'
        
        if (total + porcentagem) > 0:
            saida += ('VALOR PENDENTE R$ ').rjust(pedido.mesa.setor.destino.colunas - 10) + ('%.2f' % (total + porcentagem)).replace('.', ',').rjust(10)
        else:
            saida += ('CONTA PAGA').rjust(pedido.mesa.setor.destino.colunas)
    
    
    impressao.views.imprime_caixa(saida, pedido.mesa.setor.destino)
    
    return HttpResponseRedirect('/pedido/?id=' + str(pedido.id))

@login_required
@permission_required('restaurante.ver_pagamento')
def pagamentos_receber(request):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
        
    if request.method == 'POST' and (request.POST.has_key('cliente_id') or request.POST.has_key('user_id')):
        if request.POST.has_key('cliente_id'):
            cliente_id = request.POST['cliente_id']
            tipo_pagamento = int(request.POST['tipo'])
            cliente = Cliente.objects.get(id = cliente_id)
            cliente.pagamentos_parciais = Pagamento_parcial.objects.filter(pedido__cliente = cliente, tipo = 4, estado = 1)
            cliente.total = 0.0
            
            for pagamento_parcial in cliente.pagamentos_parciais:
                cliente.total += float(pagamento_parcial.valor)
            
            cliente.pagamentos = Pagamento.objects.filter(cliente = cliente, tipo = 1)
            
            for pagamento in cliente.pagamentos:
                cliente.total -= float(pagamento.valor)
                
            usuario = None
            tipo = 1 # Entrada
        elif request.POST.has_key('user_id'):
            user_id = request.POST['user_id']
            tipo = 2 # Saída
            cliente = None
            usuario = User.objects.get(id = user_id)
        
        try:
            valor = round(float(request.POST["valor"].replace(',','.')), 2)
        except:
            request.session['aviso'] = 'Valor inválido'
            return HttpResponseRedirect('/pagamentos/receber/')
        
        if cliente and valor > round(cliente.total, 2):
            request.session['aviso'] = 'Valor superior à dívida'
            return HttpResponseRedirect('/pagamentos/receber/')
        
        pagamento = Pagamento(usuario = usuario, cliente = cliente, valor = float(valor), tipo = tipo, data = datetime.now())
        pagamento.save()
        
        dia = Dia_funcionamento.objects.filter(fechado=None)[0]
        
#         dia.recebimento = float(dia.recebimento) + float(valor)
        
        
        if tipo_pagamento == 0:
            dia.recebimento_dinheiro = float(dia.recebimento_dinheiro) + float(valor)
        elif tipo_pagamento == 1:
            dia.recebimento_debito = float(dia.recebimento_debito) + float(valor)
        elif tipo_pagamento == 2:
            dia.recebimento_cartao = float(dia.recebimento_cartao) + float(valor)
        elif tipo_pagamento == 3:
            dia.recebimento_cheque = float(dia.recebimento_cheque) + float(valor)
        
        dia.save()
        
        if cliente:
            quem = cliente
        else:
            quem = usuario
        
        Evento(usuario = request.user, pedido = None, descricao = 'Pagamento '+ str(quem) + ' tipo ' + str(tipo)).save()
        
        if float(cliente.total) - float(valor) == 0.0:
            request.session['mensagem'] = 'Pagamento de ' + str(cliente) + ' completo. <a href=\"/\">Voltar para mesas</a>'
    
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
        
    clientes = Cliente.objects.all()
    for cliente in clientes:
        cliente.total = 0
        cliente.pagamentos_parciais = Pagamento_parcial.objects.filter(pedido__cliente = cliente, tipo = 4, estado = 1)
        
        for pagamento_parcial in cliente.pagamentos_parciais:
            cliente.total += float(pagamento_parcial.valor)
        
        cliente.pagamentos = Pagamento.objects.filter(cliente = cliente, tipo = 1)
        
        for pagamento in cliente.pagamentos:
            cliente.total -= float(pagamento.valor) 
    
    js = 'restaurante/pagamentos'
    css = 'restaurante/pagamento'
    
    return render_to_response('restaurante/pagamentos/receber.html',locals(),
        context_instance=RequestContext(request))

@login_required
@permission_required('restaurante.ver_pagamento')
def pagamentos_receber_detalhes(request, cliente_id):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
        
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
    
    if Cliente.objects.filter(id = cliente_id).count() == 0:
        request.session['aviso'] = 'Acesso inválido'
        return HttpResponseRedirect('/pagamentos/receber/')
        
    cliente = Cliente.objects.get(id = cliente_id)
    
    cliente.total = 0.0
    cliente.pagamentos_parciais = Pagamento_parcial.objects.filter(tipo = 4, pedido__cliente = cliente, estado = 1)
    for pagamento_parcial in cliente.pagamentos_parciais:
        cliente.total += float(pagamento_parcial.valor)
    
    cliente.pagamentos = Pagamento.objects.filter(cliente = cliente, tipo = 1)
        
    for pagamento in cliente.pagamentos:
        cliente.total -= float(pagamento.valor)
    
    return render_to_response('restaurante/pagamentos/receber/detalhes.html',locals(),
        context_instance=RequestContext(request))


@login_required
@permission_required('restaurante.ver_pagamento')
def retiradas(request):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
    
    dia = Dia_funcionamento.objects.get(fechado=None)
    usuarios = User.objects.filter(is_active = True)
    
    if request.method == "POST":
        try:
            valor = float(request.POST['valor'].strip().replace(',', '.'))
        except:
            request.session['aviso'] = 'Valor inválido'
        
        usuario_id = int(request.POST['usuario_id'])
        if usuario_id == 0:
            usuario = None
        else:
            usuario = User.objects.get(id = usuario_id)
            
        observacao = request.POST['observacao']
        tipo = int(request.POST['tipo'])
        
        # pagamento = Pagamento(dia = dia, cliente = None, usuario = usuario, valor = valor, tipo = 2, observacao = observacao, data = datetime.now())
        # pagamento.save()
        
        if tipo == 1: # Retirar
            dia.pagamento = float(dia.pagamento) + float(valor)
#             dia.dinheiro = float(dia.dinheiro) - float(valor)
            dia.save()
            
            Movimentacao(dia = dia, valor = valor, usuario = usuario, observacao = observacao).save()
            
            Evento(usuario = request.user, pedido = None, descricao = u'Retirada de valor "'+ unicode(observacao) + u'"').save()
            
            saida = u"RETIRADA DE VALOR".center(dia.setor.destino.colunas) + '\n'
        else: #Receber
            dia.recebimento = float(dia.recebimento) + float(valor)
#             dia.recebimento_dinheiro = float(dia.recebimento_dinheiro) + float(valor)
            dia.save()
            
            Movimentacao(dia = dia, valor = valor, usuario = usuario, observacao = observacao, tipo = False).save()
            
            Evento(usuario = request.user, pedido = None, descricao = u'Entrada de valor "'+ unicode(observacao) + u'"').save()
            
            saida = u"ENTRADA DE VALOR".center(dia.setor.destino.colunas) + '\n'
        
        saida += u"R$ " + (u"%.2f" % (valor)).replace('.', ',')
        
        if usuario_id > 0:
            nome = usuario.username
            if usuario.first_name and usuario.first_name != '':
                nome = usuario.first_name
                
                if usuario.last_name and usuario.last_name != '':
                    nome += ' ' + usuario.last_name
                    
            saida += u" - " + unicode(usuario) + '\n'
        else:
            saida += '\n'
        
        if observacao != "":
            saida += "Observacao:\n" + observacao
        
        saida += '\n\n\n\n\n'
        
        
        
        impressao.views.imprime_caixa(saida, dia.setor.destino, c = None, r = '')
        
        request.session['mensagem'] = 'Valor registrado'
    
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
    
    return render_to_response('restaurante/pagamentos/retiradas.html',locals(),
        context_instance=RequestContext(request))

@login_required
@permission_required('restaurante.unir_mesas')
def mesas_unir(request):
    if Dia_funcionamento.objects.filter(fechado=None).count() == 0:
        return render_to_response('restaurante/abertura.html', locals(),
        context_instance=RequestContext(request))
    
    dia = Dia_funcionamento.objects.get(fechado=None)
    mesas = Mesa.objects.all()
    for mesa in mesas:
        mesa.pedidos = Pedido.objects.filter(mesa = mesa, dia = dia, fechado = None)
    
    etapa = 1
    
    if request.method == "POST" and request.POST.has_key("etapa"):
        if request.POST['etapa'] == "1":
            mesas_selecionadas = map(int, request.POST.getlist('mesas'))
            if len(mesas_selecionadas) > 1:
                for mesa in mesas:
                    if mesa.pedidos.count() == 1 and mesa.id in mesas_selecionadas:
                        from pickle import dumps
                        mesa.selecionada = True
                mesas_selecionadas = dumps(mesas_selecionadas)
                
                etapa = 2
            else:
                request.session['aviso'] = 'Para unir mesas é preciso selecionar duas ou mais mesas'
                etapa = 1
        elif request.POST['etapa'] == "2":
            from pickle import loads
            mesas_selecionadas = loads(request.POST['mesas_selecionadas'])
            mesa_id = int(request.POST['mesa'])
            mesa = Mesa.objects.get(id = mesa_id)
            
            pedidos = Pedido.objects.filter(mesa_id__in = mesas_selecionadas, fechado = None)
            
            novo_pedido = Pedido(mesa = mesa, dia = pedidos[0].dia, usuario = request.user)
            # novo_pedido.save()
            
            novo_pedido.itens = []
            novo_pedido.pagamentos_parciais = []
            
            for pedido in pedidos:
                novo_pedido.total = float(novo_pedido.total) + float(pedido.total)
                novo_pedido.save()
                
                pedido.itens = Item.objects.filter(pedido = pedido)
                for item in pedido.itens:
                    item.pedido = novo_pedido
                    item.save()
                
                pedido.pagamentos_parciais = Pagamento_parcial.objects.filter(pedido = pedido)
                for pagamento in pedido.pagamentos_parciais:
                    pagamento.pedido = novo_pedido
                    pagamento.save()
                
                pedido.total = 0
                pedido.fechado = datetime.now()
                pedido.save()
            
            return HttpResponseRedirect('/pedido/?id=' + str(novo_pedido.id))
    
    mensagem = False
    aviso = False
    if request.session.has_key('mensagem'):
        mensagem = request.session['mensagem']
        del request.session['mensagem']
    if request.session.has_key('aviso'):
        aviso = request.session['aviso']
        del request.session['aviso']
    
    return render_to_response('restaurante/mesas/unir.html',locals(),
        context_instance=RequestContext(request))